Я работаю с проектом Rails 2.2 и работаю над его обновлением. Я заменяю существующие приборы фабриками (используя factory_girl) и у меня возникли некоторые проблемы. Проблема в моделях, которые представляют таблицы с поисковыми данными. Когда я создаю корзину с двумя продуктами с одинаковым типом продукта, каждый созданный продукт воссоздает один и тот же тип продукта. Это ошибки из-за уникальной проверки модели ProductType.
Проблема демонстрации
Это из модульного теста, где я создаю корзину и собираю ее по частям. Я должен был сделать это, чтобы обойти проблему. Это все еще демонстрирует проблему, хотя. Я объясню.
cart = Factory(:cart)
cart.cart_items = [Factory(:cart_item,
:cart => cart,
:product => Factory(:added_users_product)),
Factory(:cart_item,
:cart => cart,
:product => Factory(:added_profiles_product))]
Добавляются два продукта одного типа, и при создании каждого продукта он заново создает тип продукта и создает дубликаты.
Сгенерированная ошибка:
«ActiveRecord :: RecordInvalid: проверка не удалась: имя уже занято, код уже занят»
Обход
Обходной путь для этого примера - переопределить используемый тип продукта и передать в конкретный экземпляр, чтобы использовался только один экземпляр. «Add_product_type» выбирается рано и передается для каждого элемента корзины.
cart = Factory(:cart)
prod_type = Factory(:add_product_type) #New
cart.cart_items = [Factory(:cart_item,
:cart => cart,
:product => Factory(:added_users_product,
:product_type => prod_type)), #New
Factory(:cart_item,
:cart => cart,
:product => Factory(:added_profiles_product,
:product_type => prod_type))] #New
Вопрос
Каков наилучший способ использовать factory_girl с типами ассоциаций "список выбора"?
Я бы хотел бы , чтобы фабричное определение содержало все, вместо того чтобы собирать его в тесте, хотя я могу жить с этим.
Фон и дополнительные детали
заводы / product.rb
# Declare ProductTypes
Factory.define :product_type do |t|
t.name "None"
t.code "none"
end
Factory.define :sub_product_type, :parent => :product_type do |t|
t.name "Subscription"
t.code "sub"
end
Factory.define :add_product_type, :parent => :product_type do |t|
t.name "Additions"
t.code "add"
end
# Declare Products
Factory.define :product do |p|
p.association :product_type, :factory => :add_product_type
#...
end
Factory.define :added_profiles_product, :parent => :product do |p|
p.association :product_type, :factory => :add_product_type
#...
end
Factory.define :added_users_product, :parent => :product do |p|
p.association :product_type, :factory => :add_product_type
#...
end
Цель «кода» ProductType состоит в том, чтобы приложение могло придать им особое значение. Модель ProductType выглядит примерно так:
class ProductType < ActiveRecord::Base
has_many :products
validates_presence_of :name, :code
validates_uniqueness_of :name, :code
#...
end
заводы / cart.rb
# Define Cart Items
Factory.define :cart_item do |i|
i.association :cart
i.association :product, :factory => :test_product
i.quantity 1
end
Factory.define :cart_item_sub, :parent => :cart_item do |i|
i.association :product, :factory => :year_sub_product
end
Factory.define :cart_item_add_profiles, :parent => :cart_item do |i|
i.association :product, :factory => :add_profiles_product
end
# Define Carts
# Define a basic cart class. No cart_items as it creates dups with lookup types.
Factory.define :cart do |c|
c.association :account, :factory => :trial_account
end
Factory.define :cart_with_two_different_items, :parent => :cart do |o|
o.after_build do |cart|
cart.cart_items = [Factory(:cart_item,
:cart => cart,
:product => Factory(:year_sub_product)),
Factory(:cart_item,
:cart => cart,
:product => Factory(:added_profiles_product))]
end
end
Когда я пытаюсь определить корзину с двумя товарами одного и того же типа продукта, я получаю ту же ошибку, описанную выше.
Factory.define :cart_with_two_add_items, :parent => :cart do |o|
o.after_build do |cart|
cart.cart_items = [Factory(:cart_item,
:cart => cart,
:product => Factory(:added_users_product)),
Factory(:cart_item,
:cart => cart,
:product => Factory(:added_profiles_product))]
end
end