Rails 3使用has_many关联查询

时间:2013-03-11 23:45:58

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我有以下模型:recommendationsratingsproductproduct has_many recommendationsrecommendation has_many productsrecommendation 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_idrating_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_sets的所有评级。如何为每个推荐和rating_set取回一系列评级。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的数据模型实际上是您所描述的吗?您的初始描述似乎表明它是所有父级 - >子级(一对多)关系。产品具有一对多的推荐和推荐具有一对多的评级

这意味着像这样的表结构:

products table
:id

recommendations table
:id
:product_id

ratings table
:id
:recommendation_id

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

如果是这样,我会说您的查询应该有效,但是您需要通过为两个产品定义字段而不是has_manybelongs_tohas_and_belongs_to_many来帮助Rails。和推荐模型。

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