【问题标题】:How to write factorygirl for table that have fields containing ruby keyword?如何为包含 ruby​​ 关键字字段的表编写 factorygirl?
【发布时间】:2013-12-12 08:00:04
【问题描述】:

我有一个表,其中一个字段名为end。我如何为该表编写工厂:

我尝试使用报价,但它不起作用:

FactoryGirl.define do
  factory :open_hour do
    location
    day { Date::DAYNAMES.sample.downcase }
    start { Time.now.strftime('%H:%M') }
    'end' { Time.now.strftime('%H:%M') }
  end
end

【问题讨论】:

    标签: ruby rspec ruby-on-rails-4 factory-bot


    【解决方案1】:

    来自FactoryGirl docs

    factory :user do
      name 'Billy Idol'
    end
    

    和:

    factory :user do
      add_attribute :name, 'Billy Idol'
    end
    

    是等价的。

    【讨论】:

    • 在这种情况下add_attribute :end, Time.now.strftime('%H:%M') ?
    • 不,这相当于(假设的)end Time.now....,它将具有一个特定的(总是相同的)默认值。如果你想保持相同的功能(即每个默认值的新获取值),你需要add_attribute :end { Time.now.... }
    • 此格式适用于带空格的字段:add_attribute 'Start Time', 'value'
    【解决方案2】:

    过去尝试执行此操作时遇到了一些可怕的问题,我建议您将这些字段重命名为“start_time”和“end_time”。将字段/方法命名为“end”可能会导致其他意料之外的问题,追踪它们可能会非常烦人。 'end_time' 还有一个优点是可以更清楚地解释它是什么。

    【讨论】:

    • 很好的建议。我将把 start 和 end 都重命名为 start_timeend_time
    【解决方案3】:

    或者你可以使用规范的ruby方式,因为'end'是一个函数,在这种情况下,你可以将它称为object.send :method, [args]

    FactoryGirl.define do
      factory :open_hour do
        location
        day { Date::DAYNAMES.sample.downcase }
        start { Time.now.strftime('%H:%M') }
        send :end, Time.now.strftime('%H:%M')
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多