これはPolymorphic Associationの良い例のように思えます。
class Review < ActiveRecord::Base
belongs_to :user
belongs_to :reviewable, :polymorphic => true
end
class Merchant < ActiveRecord::Base
has_many :reviews, :as => :reviewable
end
class Product < ActiveRecord::Base
has_many :reviews, :as => :reviewable
end
@merchant.reviews
次に、とを呼び出し@product.reviews
て、販売者と製品のレビューをそれぞれ取得できます。そして@review.reviewable
、レビューされたオブジェクトを取得するために呼び出すことができます。
ポリモーフィックな関連付けは、次のようなテーブル構造に基づいています。
--------------------------------------------------
id | integer
user_id | integer
reviewable_id | integer
reviewable_type | string
value | integer
created_at | timestamp without time zone
updated_at | timestamp without time zone
--------------------------------------------------
reviewable_type
列には「レビュー可能な」オブジェクトのクラス名が保持され、 にはそのreviewable_id
ID が保持されます。移行では、次を使用してこれらの列を作成できます。
t.references :reviewable, :polymorphic => true