Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在常量中创建ActiveRecord对象是否不好?_Ruby On Rails_Ruby_Ruby On Rails 4_Activerecord - Fatal编程技术网

Ruby on rails 在常量中创建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时,通过良好。但是,当我运行整个测试套件时,或者甚至只是

我有一些代码,我在模型中将ActiveRecord对象创建为常量,如下所示:

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