3

次のモデルがあります: recommendationsratingsおよびproduct。A product has_many recommendations、 a recommendation has_many products、 a 、recommendation has_many ratingsおよび a rating belongs_toa recommendation
現在、次のクエリを使用して、インデックス内のすべてのレコードを検索しています。

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

各レコードの推奨評価を取得するために、ビューで I call を使用した別のスコープがあります。

特定のand@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_set のすべての評価を取得します。具体的な推奨事項。各推奨事項と rating_set の評価の配列を取得するにはどうすればよいですか。

4

2 に答える 2

0

あなたのデータモデルは実際にあなたが説明したとおりですか? あなたの最初の説明は、それがすべて親子 (1 対多) の関係であることを示しているようでした。製品には 1 対多のレコメンデーションがあり、レコメンデーションには 1 対多の評価があります

これは、次のようなテーブル構造を意味します。

products table
:id

recommendations table
:id
:product_id

ratings table
:id
:recommendation_id

ただし、投稿した生成されたすべての SQL クエリは、 と呼ばれる何らかの結合テーブルを示しているようですproduct_recommendations。それは何ですか?という結合テーブルを使用して、製品とレコメンデーションの間に実際に多対多の関係がありますproduct_recommendationsか?

その場合、クエリは機能するはずですが、製品モデルhas_manyと推奨モデルの両方に対してフィールドを定義することで、Rails を少し支援する必要があります。belongs_tohas_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 に答える