Общие атрибуты в factory_girl

У меня есть несколько моделей с адресом, у некоторых только address, у некоторых и shipping_address, и billing_address. Схема адресов та же. В factory_girl мне нужно скопировать и вставить определения атрибутов адреса, но было бы здорово, если бы здесь можно было использовать какой-то макрос.

Я хотел бы иметь что-то вроде этого:

factory :organization do
  name          { Faker::Name.name }
  # this could define street, city, zip, ... with prefix shipping_address
  has_address :shipping_address
emnd

Как это сделать?


person fifigyuri    schedule 02.04.2014    source источник
comment
адреса могут идти к разным именам столбцов? или это всегда shipping_address ?   -  person apneadiving    schedule 02.04.2014
comment
Да, он может идти в столбец с разными префиксами, поэтому есть адрес с полями street, city, zip, ... но с префиксом billing_address, shipping_address и т.д.   -  person fifigyuri    schedule 02.04.2014
comment
О, столбцы имеют префикс. Тогда мой ответ не годится! Если адреса имеют одинаковую схему, возможно, вы можете извлечь их в свою собственную модель (и таблицу БД) и вместо этого использовать ассоциацию?   -  person Calle Erlandsson    schedule 02.04.2014
comment
Я могу использовать ваш ответ, я оценил его. Раньше у меня была такая ассоциация, но это добавляет дополнительную сложность, за которую я не хочу платить. Я стараюсь избегать вложенности и использую ее только тогда, когда для этого есть причина.   -  person fifigyuri    schedule 02.04.2014


Ответы (1)


Я думаю, что использование черты может быть действительно хорошим решением вашей проблемы:

require 'factory_girl'
require 'active_model'

class Person
  include ActiveModel::Model
  attr_accessor :name, :address
end

class Organization
  include ActiveModel::Model
  attr_accessor :name, :address
end

FactoryGirl.define do
  factory :person do
    name 'John Doe'
  end

  factory :organization do
    name 'Some corp'
  end

  trait :with_address do
    address '1234 Some road'
  end
end

p FactoryGirl.build(:person, :with_address)       #=> #<Person:0x007f8d220baca0 @name="John Doe", @address="1234 Some road">
p FactoryGirl.build(:organization, :with_address) #=> #<Organization:0x007fc9a1a30008 @name="Some corp", @address="1234 Some road">
person Calle Erlandsson    schedule 02.04.2014