什麼是 Polymorphic Association 多型關聯

使用場景例如,你的網站上有圖片 (Image) 和影片 (Video) 兩種 model,而 PM 告訴你,他想要讓這兩種 model 都可以留言 (Comment)

如果不使用 Polymorphic 的話,那你可能會產生 ImageComment 和 VideoComment 兩種 model 。而這兩者的行為又完全相同,這就違反了 DRY 的原則。

我們可以使用 Polymorphic Association 來解決這樣的需求

rails g model comment content:text commentable_id:integer commentable_type

會產生這樣的 migration 檔案

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :content
      t.integer :commentable_id
      t.string :commentable_type

      t.timestamps
    end
  end
end

或是可以寫成這樣

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :content
      t.belongs_to :commentable, :polymorphic => true

      t.timestamps
    end
  end
end

中間 t.belongs_to :commentable, :polymorphic => true
則會自動產生 commentable_id 和 commentable_type 這兩個欄位

而在 Model 的部份,只要這樣設定即可

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => true
end

class Video < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class Image < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

這樣一來就算之後還有第三、四、N 種 Model 可以被 Comment。也只要加入上述的 relation 就可以搞定了。

results matching ""

    No results matching ""