Ruby on rails 在常量中创建ActiveRecord对象是否不好?
我有一些代码,我在模型中将ActiveRecord对象创建为常量,如下所示:Ruby on rails 在常量中创建ActiveRecord对象是否不好?,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,我有一些代码,我在模型中将ActiveRecord对象创建为常量,如下所示: class OrderStage < ActiveRecord::Base validates :name, presence: true, uniqueness: true DISPATCHED = find_or_create_by(name: 'Dispatched') end 当我单独运行它时,或者当我只运行order\u spec.rb时,通过良好。但是,当我运行整个测试套件时,或者甚至只是
class OrderStage < ActiveRecord::Base
validates :name, presence: true, uniqueness: true
DISPATCHED = find_or_create_by(name: 'Dispatched')
end
当我单独运行它时,或者当我只运行order\u spec.rb
时,通过良好。但是,当我运行整个测试套件时,或者甚至只是spec/models
时,我会遇到以下错误:
Failure/Error: expect(Order.all.map(&:order_stage)).to eq [OrderStage::DISPATCHED]
expected: [#<OrderStage id: 1, name: "Dispatched">]
got: [nil]
所以这一定与在常量中创建ActiveRecord对象有关,这是一件坏事吗?您应该使用class方法
attr_accessible :name
def self.dispatched
@dispatched ||= find_or_create_by_name('Dispatched')
end
private
def self.reset!
@dispatched = nil
end
我同意这种做法。更容易测试,这很有效。我猜问题在于,即使数据库已经清理,常数在测试之间也会持续存在。在spec_helper中,您必须编写
Model.reset代码>在每个块后面。
Failure/Error: expect(Order.all.map(&:order_stage)).to eq [OrderStage::DISPATCHED]
expected: [#<OrderStage id: 1, name: "Dispatched">]
got: [nil]
it 'lists all order stages' do
order_stage = OrderStage.find_or_create_by(name: 'Dispatched')
create(:order, order_stage: order_stage)
expect(Order.all.map(&:order_stage)).to eq [order_stage]
end
attr_accessible :name
def self.dispatched
@dispatched ||= find_or_create_by_name('Dispatched')
end
private
def self.reset!
@dispatched = nil
end