Я работаю над проектом Rails 2.2, который обновляет его. Я заменяю существующие светильники фабриками (с использованием factory_girl), и у вас были некоторые проблемы. Проблема заключается в моделях, которые представляют таблицы с данными поиска. Когда я создаю корзину с двумя продуктами, имеющими один и тот же тип продукта, каждый созданный продукт воссоздает тот же тип продукта. Это ошибки от уникальной проверки на модели ProductType.
Демонстрация проблем
Это из unit test, где я создаю корзину и складываю ее в куски. Я должен был сделать это, чтобы решить проблему. Однако это все еще демонстрирует проблему. Я объясню.
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 с типами "pick-list"?
Я бы хотел, чтобы определение factory содержало все, а не собирать его в тесте, хотя я могу жить с ним.
Фон и дополнительные данные
заводы/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 "code" заключается в том, что приложение может придать им особый смысл. Модель 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