Rails——需要帮助来建立松散耦合的关联



我有以下模型,以及它们之间的相关关联:

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(如果存在评论)。

我需要保持ratingsreviews松散耦合。(我不想设置我的模型,使Review belongs_to Rating)

如何建立rating'sreviews的关联?

一旦我在视图中处理特定的评级,我可以调用@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

最新更新