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
            )

这可以按预期工作,但是我的问题是我有多个recommendation_sets属于 multiple products,并且每个recommendation_sets可能具有相同的recommendation. 通过像我目前所做的那样将每个保存recommendation到 a中,如果两个具有相同的,则只有一组会添加。无论如何都可以使用辅助 id 将每个保存为多个,例如 save by ,还是我需要将此关系更改为 a ?recommendation_setrecommendation_setsrecommendationrecommendationrecommendationrecommendation_setsrecommendation_id_and_product_idhas_many :through

4

1 回答 1

0

RecommendationSet根据您的澄清,我认为您在和之间基本上具有多对多的关系Recommendation。目前,您有一对多。

有几个选项:

  1. 使用has_and_belongs_to_many两个模型中的方法来描述关系;
  2. 手动创建一个“连接”模型,然后给这个连接模型RecommendationSetRecommendation一个has_many(连接模型中的两条对应belongs_to的线指向另外两个模型);
  3. 一种has_many ... :through风格,就像你提到的

请注意,前两个选项要求您有一个连接表。

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

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 回答