У меня есть следующие модели:
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
в несколько recommendation_sets
с использованием вторичного идентификатора, например, сохранить по recommendation_id_and_product_id
, или мне нужно изменить эту связь на has_many :through
?
Product.where(:wmt_id=>product).first_or_create(ItemData.get_product_data(product)
. Это также будет работать для строкиProductRecommendationSet
ниже; вместо того, чтобы использовать этот длинныйfind_or_create_by_foo_and_bar_and_baz_and....
, вы можете поместить все это в.where
и вызватьfirst_or_create
- person Paul Richter   schedule 01.10.2013ProductRecommendationSet
внутри круглых скобок. Кроме того, 2-я строка в блоке создания, у вас естьfind_by_rec_id
иcreate
сами по себе; какие модели создаются на этой линии? Наконец, 4-я строка в том же блоке, у вас есть переменная с именемsec_set
, но я нигде ее не вижу. Это опечатка или переменная определена где-то еще? - person Paul Richter   schedule 01.10.2013