Споделени атрибути във 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
Да, може да отиде в колона с различни префикси, така че има адрес с полета улица, град, пощенски код, ... но има префикс от billing_address, shipping_address и т.н.   -  person fifigyuri    schedule 02.04.2014
comment
О, колоните са с префикс. Тогава отговорът ми не е добър! Ако адресите имат една и съща схема, може би можете да ги извлечете в техния собствен модел (и db таблица) и вместо това да използвате асоциация?   -  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