2ちゃんねるのような1の書き込みがスレッドを作成すると同時にコメントを1件書き込む仕組みは accepts_nested_attributes_for を使うと簡潔に書ける

公開日:2018-10-15
最終更新:2018-10-24
require "active_support/all"
require "active_record"

ActiveRecord::Migration.verbose = false
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")

ActiveRecord::Schema.define do
  create_table :topics do |t|
    t.string :subject, null: false
    t.timestamps null: false
  end
  create_table :comments do |t|
    t.belongs_to :topic, null: false
    t.integer :position, null: false
    t.text :body, null: false
  end
end

class Topic < ActiveRecord::Base
  with_options dependent: :destroy do
    has_one :comment, -> { order(:position) }
    has_many :comments
  end

  default_scope { order(updated_at: :desc) }
  accepts_nested_attributes_for :comment
end

class Comment < ActiveRecord::Base
  belongs_to :topic, touch: true # コメントを更新するとトピックが自動的に「上がる」仕組み
  default_scope { order(:position) }

  before_create do
    self.position = topic.comments.count + 1
    true
  end
end

topic = Topic.create!(subject: "タイトル", comment_attributes: {body: "1コメ"})
topic.comments.create!(body: "2コメ")
topic.comments.create!(body: "3コメ")

topic.reload
topic.comment.position          # => 1
topic.comment.body              # => "1コメ"

topic.subject                                      # => "タイトル"
topic.comments.collect {|e| [e.position, e.body] } # => [[1, "1コメ"], [2, "2コメ"], [3, "3コメ"]]
記事が少しでもいいなと思ったらクラップを送ってみよう!
36
+1
@warabimochiの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする