BETA

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コメ"]]
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@warabimochiの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!