我有以下模型,以及它们之间的相关关联:
class User < ActiveRecord::Base
has_many :reviews
has_many :ratings
end
class Product < ActiveRecord::Base
has_many :reviews
has_many :ratings
end
class Review < ActiveRecord::Base
belongs_to :product
belongs_to :user
end
class Rating < ActiveRecord::Base
belongs_to :product
belongs_to :user
end
给定一个特定的Rating
,我需要得到相应的Review
(如果存在评论)。
我需要保持ratings
和reviews
松散耦合。(我不想设置我的模型,使Review
belongs_to
Rating
)
如何建立rating's
和reviews
的关联?
一旦我在视图中处理特定的评级,我可以调用@rating.product.reviews.where(:user_id => @rating.user.id).first
,但我希望它更干净/更有效,如果可能的话。
任何想法?
谢谢。
尝试使用:条件:
class Rating < ActiveRecord::Base
has_many :reviews,
:through => :user,
:source => :reviews,
:conditions => ['#{Review.table_name}.product_id = #{product_id}']
end
如果这不起作用,请这样做(非常像@ robinbrowwer的回答):
class Rating < ActiveRecord::Base
def reviews
user.reviews.where(:product => product)
end
end
您可以创建一个has_many :through
关系来获取所有的评论。
class Rating < ActiveRecord::Base
belongs_to :product
belongs_to :user
has_many :product_reviews, :through => :product, :source => :reviews
end
现在,您可以执行以下操作来完成与上面相同的操作:
@rating.product_reviews.where(:user_id => @rating.user.id).first
并不是一个很大的进步。你可以把它放在一个实例方法中来清理:
def review
product_reviews.where(:user_id => user_id).first
end
现在您只需执行以下操作即可获得相同的结果:
@rating.review
。