我有以下型号:
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>
答案 0 :(得分:0)
根据您的澄清,我认为您基本上在RecommendationSet
和Recommendation
之间存在多对多关系。目前,你有一对多。
有几种选择:
has_and_belongs_to_many
方法来描述关系; RecommendationSet
和Recommendation
has_many
同时添加到此联接模型中(在联接模型中指向两条相应的belongs_to
行到其他两个模型); 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
的想法非常好。
让我知道这是否有帮助