怖話でcomment付ける対象なんて"怖い話"だけに決まってるじゃん!

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :body
      t.references :story

      t.timestamps
    end
  end
end

余裕過ぎワロタwww

1年後・・・

"怖い漫画"・・・だと・・・!?

\( ^o^)/ オワタ

じゃ、じゃあ、comic_commentsというテーブルを・・・(レガシー直行)

commentをcommentableにする

でも大丈夫、後からでもcommentableに移行できます。今回はacts_as_commentableを使いました。

# Gemfile:
gem 'acts_as_commentable', '2.0.1'
% rails g comment

modelとmigrationでファイルを上書きしそうになるけど上書きしない。

# app/models/comment.rb:
class Comment < ActiveRecord::Base
  include ActsAsCommentable::Comment
  belongs_to :commentable, polymorphic: true, counter_cache: true
end
# app/models/story.rb:
class Story < ActiveRecord::Base
  has_many :comments, as: :commentable, dependent: :destroy
  acts_as_commentable
  attr_readonly :comments_count
end
# app/models/comic.rb:
class Comic < ActiveRecord::Base
  has_many :comments, as: :commentable, dependent: :destroy
  acts_as_commentable
  attr_readonly :comments_count
end

polymorphicかつcounter_cache使う時は、相手先をreadonlyにしとく必要があるみたいです。

class AddCommentableToComment < ActiveRecord::Migration
  def up
    rename_column :comments, :story_id, :commentable_id
    add_column :comments, :commentable_type, :string, default: 'Story'

    add_index :comments, :commentable_id
    add_index :comments, :commentable_type
  end

  def down
    rename_column :comments, :commentable_id, :story_id
    remove_column :comments, :commentable_type
  end
end

これで既にコメントが沢山あってもcommentableへの移行がバッチリ。この調子でtag, category, voteもどんどんやっていこう!

Comments


Option