3

我有以下型号recommendationsratingsproduct。一个product has_many recommendations,一个recommendation has_many products,一个recommendation has_many ratingsrating belongs_to一个recommendation
我目前正在使用以下查询来查找索引中的所有记录:

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

为了获得每条记录的推荐评级,我认为我有另一个范围。

我要设置什么@recommendatons来取回由特定product_idand找到的所有推荐和评级rating_set

我试过了:

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

哪个被打印出来了Nil

更新模型:

产品

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"])])

我在查询什么:我需要找到 product_id 和 rating_set = 的所有推荐?,?并鉴于此,找到属于这些建议中的每一个的所有评级。

更新

我可以使用以下查询取回属于推荐的所有评分: Recommendation.joins(:product_recommendations).includes(:ratings).where(:product_recommendations => { :rating_set => 48, :product_id => 2144877 }) 当我遍历返回的评分数组时,它们的范围不限于正确的 rating_set,而是我得到所有 rating_set 的所有评分属于具体建议。如何获取每个推荐和 rating_set 的一系列评分。

4

2 回答 2

0

您的数据模型是否真的如您所描述的那样?您最初的描述似乎表明这都是父->子(一对多)关系。产品具有一对多的推荐和推荐具有一对多的评级

这意味着这样的表结构:

products table
:id

recommendations table
:id
:product_id

ratings table
:id
:recommendation_id

但是,您发布的所有生成的 SQL 查询似乎都显示了某种名为product_recommendations. 那是什么?您实际上是否在产品和推荐之间使用名为 的连接表建立了多对多关系product_recommendations

如果是这样,我会说您的查询应该可以工作,但您需要通过定义字段而不是产品和推荐模型来has_many帮助belongs_toRails has_and_belongs_to_many

看看这是否有帮助http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association

于 2013-03-12T04:22:17.533 回答
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
于 2013-03-12T00:00:54.570 回答