Rails 3中具有has_many关联的查询

3
我有以下模型:recommendationsratingsproduct。一个product拥有多个recommendations,一个recommendation拥有多个products和多个ratings,一个rating属于一个recommendation
目前我正在使用以下查询在我的索引中查找所有记录:
@recommendations = Recommendation.find(:all, :joins => :products, :conditions => ["product_id = ? AND rating_set = ?", (params["product_id"]), (params["rating_set_id"])])

为了获取每条记录的推荐评分,我在我的视图中调用了另一个作用域。

如果要获取特定product_idrating_set找到的所有推荐和评分,我应该将@recommendations设置为什么?

我尝试过:

    Recommendation.find(:all, :joins => :products,:include => :ratings, :conditions => ["product_id = ? AND rating_set = ?",2086981,40]).each do |rec|
puts rec.rating
end

这句话打印出了 Nil

更新了模型:

产品(Product)

class Product < ActiveRecord::Base  
  has_many :product_recommendations, :dependent => :destroy
  has_many :recommendations, :through => :product_recommendations
end

建议

class Recommendation < ActiveRecord::Base
  has_many :product_recommendations, :dependent => :destroy
  has_many :products, :through => :product_recommendations
  has_many :ratings
end

评分:

class Rating < ActiveRecord::Base
  belongs_to :recommendation  
end

这是我需要的结果(只有当评分已创建时才能使用,这就是为什么我不能使用它):

@recommendations = Rating.find(:all, :conditions => ["product_id = ? AND rating_set = ?", (params["product_id"]), (params["rating_set_id"])])

我的查询目标是: 我需要找到所有商品id和评分集=?,?的推荐,并在此基础上,找到每个推荐所属的所有评分。

更新

使用以下查询,我能够获取属于某个推荐的所有评分: Recommendation.joins(:product_recommendations).includes(:ratings).where(:product_recommendations => { :rating_set => 48, :product_id => 2144877 }) 当我遍历返回的评分数组时,它们并没有限定为正确的评分集,而是我得到了属于特定推荐的所有评分集的所有评分。如何获取每个推荐和评分集的评分数组?


Recommendation.find(:all, :joins => :products,:include => :ratings) 返回什么? - Michael Durrant
我是指有多少行? - Michael Durrant
返回了约240万行。 - Yogzzz
每个评分集(评分集=40、41、47)包含5个产品。 - Yogzzz
是的,抱歉,我看错了另一个查询。对于rating_set 48和product_id 2144877,我得到了5条记录,每个记录都属于rating_sets 48、52、21。 - Yogzzz
显示剩余5条评论
2个回答

0

试试这个,

recommendations = Recommendation.joins(:product).includes(:ratings).where(:product_id => 2086981, :rating_set => 40).all
recommendations.each do |rec|
  puts rec.ratings # this will return an array of ratings if this recommendation has ratings.
end

我认为你的:joins => :products应该是单数形式::joins => :product,而你的:include应该是:includes

编辑:

新查询与发布的新模型代码中的关系匹配:

recommendations = Recommendation.joins(:products, :product_recommendations).includes(:ratings).where(:products => { :id => 2086981 }, : product_recommendations => { :rating_set => 40 }).all
recommendations.each do |rec|
  puts rec.ratings # this will return an array of ratings if this recommendation has ratings.
end

这个不行,它需要是 products。如果我使用 product,我会得到一个关联未找到的异常。如果我将其更改为与上面相同的查询,并将其更改为 products,我会得到以下结果:Mysql2 :: Error:'where clause'中的未知列'recommendations.product_id':SELECT recommendations。* FROM recommendations INNER JOIN product_recommendations ON product_recommendations.recommendation_id = recommendations.id INNER JOIN products ON products.id = product_recommendations.product_id WHERE recommendations.product_id = 2086981 AND recommendations.rating_set = 40 - Yogzzz
我仍然收到异常:Mysql2 :: Error:Unknown column recommendations.rating_set - Yogzzz
我已经更新了查询,请现在尝试。错误显示在Recommendation模型中没有rating_set列,因此我已从查询中删除了该条件。也许你的模型中有rating_set列吗?问题表明rating_set列是在Recommendation模型中的。 - Sam
也许在另一个模型中? - Sam
是否可以返回每个推荐的单个评分,而不是评分数组? - Yogzzz
显示剩余3条评论

0

你的数据模型是否与你所描述的一样?你最初的描述似乎表明它是所有父子关系(一对多)。产品与推荐之间存在一对多的关系,而推荐与评分之间也存在一对多的关系。

这意味着表结构可能如下所示:

products table
:id

recommendations table
:id
:product_id

ratings table
:id
:recommendation_id

然而,您发布的所有生成的SQL查询似乎都显示了一种名为product_recommendations的连接表。那是什么?

如果是这样,我想说您的查询应该可以工作,但您需要通过将字段定义为ProductRecommendation模型的has_and_belongs_to_many而不是has_manybelongs_to来帮助Rails。

请参阅此处是否有所帮助 http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association


更新我的模型信息。 - Yogzzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接