【问题标题】:Shared attributes in factory_girlfactory_girl 中的共享属性
【发布时间】:2014-04-02 07:33:46
【问题描述】:

我有更多型号有地址,有些只有address,有些同时有shipping_addressbilling_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

怎么做?

【问题讨论】:

  • 地址可以转到不同的列名吗?或者它总是shipping_address
  • 是的,它可以转到具有不同前缀的列,因此有一个包含街道、城市、邮政编码等字段的地址...但它的前缀是 billing_address、shipping_address 等。
  • 哦,列有前缀。那我的回答不行!如果地址具有相同的架构,也许您可​​以将它们提取到自己的模型(和 db 表)中并使用关联?
  • 我可以利用你的回答,我很感激。我之前有它的关联,但这增加了额外的复杂性,我不想支付。我尽量避免嵌套,只有在有理由的时候才使用它。

标签: ruby-on-rails factory-bot


【解决方案1】:

我认为使用 trait 可以很好地解决您的问题:

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">

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 2013-04-13
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多