Rails 4:通过 FactoryGirl 属性设置枚举字段

Que*_*ker 5 ruby enums ruby-on-rails ruby-on-rails-4 factory-bot

我有一个具有枚举作为属性的模型。

class ApplicationLetter < ActiveRecord::Base
  belongs_to :user
  belongs_to :event

  validates :user, :event, presence: true

  enum status: {accepted: 1, rejected: 0, pending: 2}

end
Run Code Online (Sandbox Code Playgroud)

以及生成此模型并为枚举设置值的工厂

FactoryGirl.define do
  factory :application_letter do
    motivation "motivation"
    user
    event
    status :accepted
  end
end
Run Code Online (Sandbox Code Playgroud)

在控制器测试中,我想通过工厂获得有效的属性

let(:valid_attributes) { FactoryGirl.build(:application_letter).attributes }
Run Code Online (Sandbox Code Playgroud)

并创建具有这些属性的应用程序。

application = ApplicationLetter.create! valid_attributes
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

ArgumentError: '1' 不是有效状态

为什么状态被解释为字符串?如果我在工厂中更改状态,我会收到相同的错误,但使用正确的相应编号。

Ole*_*huk 6

你可以更动态地做到这一点:

FactoryGirl.define do
  factory :application_letter do
    motivation "motivation"
    user
    event
    status { ApplicationLetter.statuses.values.sample }
  end
end
Run Code Online (Sandbox Code Playgroud)

在这每次你会得到不同的状态

或者,如果要使用静态值,则必须使用整数,因为enums 默认使用整数值


Roc*_*ice 1

let(:valid_attributes) { FactoryGirl.build(:application_letter).attributes.merge(status: 'accepted') }
Run Code Online (Sandbox Code Playgroud)

  • 这些解决方案对我来说看起来有点“hacky”。我对 Rails(以及一般的 Ruby)比较陌生,但我认为像其他属性一样直接在工厂中设置状态会很好。我已经对你的答案投了赞成票,这确实非常有帮助,但也许他们是一个更好的解决方案,对我来说看起来更干净。如果这样的解决方案不存在,我当然会接受你的答案:) (2认同)