使用多个键保存rails has_many关联

时间:2013-10-01 14:22:58

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 model-associations

我有以下型号:

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
            )

这可以正常工作,但我的问题是我有多个recommendation_sets属于多个products,而recommendation_sets中的每个recommendation可能都有recommendation。通过将每个recommendation_set保存到我目前正在进行的recommendation_sets,如果两个recommendation具有相同的recommendation,则只有一个集合会添加recommendation 。是否仍然使用辅助ID将每个recommendation_sets保存到多个recommendation_id_and_product_id,例如has_many :through保存,或者我是否需要将此关联更改为{{1}}?< / p>

1 个答案:

答案 0 :(得分:0)

根据您的澄清,我认为您基本上在RecommendationSetRecommendation之间存在多对多关系。目前,你有一对多。

有几种选择:

  1. 在两个模型中使用has_and_belongs_to_many方法来描述关系;
  2. 手动创建“加入”模型,然后将RecommendationSetRecommendation has_many同时添加到此联接模型中(在联接模型中指向两条相应的belongs_to行到其他两个模型);
  3. has_many ... :through样式,就像你提到的那样
  4. 请注意,前两个选项要求您拥有连接表。

    如果您需要有关连接表/模型的其他信息,我倾向于使用第二个选项。否则,第一个或第三个完全有效。

    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的想法非常好。

    让我知道这是否有帮助