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

时间:2011-07-09 17:30:36

标签: ruby-on-rails ruby-on-rails-3 activerecord associations

我有以下模型及其相关关联:

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_toRating

如何设置与rating's的{​​{1}}关联?

一旦我在视图中使用特定评级,我可以致电reviews,但如果可能的话,我希望它更清洁/更高效。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

尝试使用:条件如下:

class Rating < ActiveRecord::Base
  has_many :reviews,
           :through => :user,
           :source => :reviews,
           :conditions => ['#{Review.table_name}.product_id = #{product_id}']
end

如果这不起作用,请改为执行此操作(非常类似于@RobinBrouwer的回答):

class Rating < ActiveRecord::Base
  def reviews
    user.reviews.where(:product => product)
  end
end

答案 1 :(得分:0)

您可以创建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

就是这样。