0

私は次のモデルを持っています:

class Product < ActiveRecord::Base
  has_many :product_recommendation_sets, :dependent => :destroy
  has_many :recommendation_sets, :through => :product_recommendation_sets
end

class RecommendationSet < ActiveRecord::Base
  has_many :product_recommendation_sets, :dependent => :destroy
  has_many :products, :through => :product_recommendation_sets

  has_many :recommendations 
end

class Recommendation < ActiveRecord::Base
   belongs_to :recommendation_set
end

recommendations recommendations_setそして、次のように追加しています:

p = Product.find_by_wmt_id(product) || Product.create( ItemData.get_product_data(product) )     
recommendation =  find_by_rec_id(rec_id) || create( ItemData.get_product_data(rec_id) )        
                rec_set =  RecommendationSet.find_or_create_by_rating_set_id_and_model_version_and_product_id(rating_set.id, model_version, p.id)
                sec_set.update_attributes(
                :rating_set_id => rating_set.id,
                :product_id    => p.id,
                :model_version => model_version,
                :notes => note
                )

                sec_set.recommendations << recommendation
                sec_set.save

prs = ProductRecommendationSet.find_or_create_by_recommendation_set_id_and_rating_set_id_and_product_id(rec_set .id, rating_set.id, p.id,)
            prs.update_attributes(
            :recommendation_set_id => rec_set.id, 
            :rating_set_id => rating_set.id,
            :product_id => p.id
            )

これは期待どおりに機能しますが、私の問題は、 multiplerecommendation_setsに属する複数productsがあり、それぞれがrecommendation_sets同じrecommendation. 私が現在行っているようにそれぞれrecommendationを aに保存することにより、2 つが同じを持っている場合、セットの 1 つだけがそれを追加します。save by などのセカンダリIDを使用して、それぞれを複数に保存する方法はありますか?または、この関係をに変更する必要がありますか?recommendation_setrecommendation_setsrecommendationrecommendationrecommendationrecommendation_setsrecommendation_id_and_product_idhas_many :through

4

1 に答える 1

0

あなたの説明に基づいて、基本的に と の間に多対多の関係があると思いRecommendationSetますRecommendation。現在、あなたは一対多を持っています。

いくつかのオプションがあります。

  1. has_and_belongs_to_many両方のモデルでメソッドを使用して関係を記述します。
  2. 「結合」モデルを手動で作成し、この結合モデルにRecommendationSetRecommendationa の両方を指定has_manyします (結合モデルの 2 つの対応するbelongs_to行が他の 2 つのモデルを指しています)。
  3. has_many ... :throughあなたが言ったようなスタイル

最初の 2 つのオプションでは、結合テーブルが必要であることに注意してください。

結合テーブル/モデルに関する追加情報が必要な場合は、2 番目のオプションを使用する傾向があります。それ以外の場合は、1 番目または 3 番目のいずれかが完全に有効です。

RailsCasts の Ryan Bates がこれに関するエピソードを作成しました: http://railscasts.com/episodes/47-two-many-to-many

Rails のドキュメントからの詳細情報: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Many-to-many

要するに、結合に関する追加情報が必要ない場合は、あなたの考えhas_many ... :throughはまったく問題ないと思います。

それが役立つかどうか教えてください

于 2013-10-02T03:07:42.007 に答える