获取ActiveRecord::RecordNotUnique,但无法找到现有记录



我有如下代码:(模型名称更改,因为它们对正在发生的事情不重要)

#find_or_create_bar_for_blah_id在大多数情况下都可以正常工作。偶尔它会返回nil,虽然我不确定为什么。

这是一种竞态条件,因为问题发生在作为应用程序一部分运行的救援作业中。

关于#find_or_create_bar_for_blah_id如何返回nil的任何线索?

class Foo < ActiveRecord::Base
  has_many   :bars, :dependent => :destroy
  def find_or_create_bar_for_blah_id(locale_id)
    begin
      bars.where(:blah_id => blah_id).first || bars.create!(:blah_id => blah_id)
    rescue ActiveRecord::RecordNotUnique
      bars.where(:blah_id => blah_id).first
    end
  end
end
class Bar < ActiveRecord::Base
  belongs_to :foo
  validates_uniqueness_of :blah_id, :scope => :foo_id
end

# db/schema.rb
create_table "bars", :force => true do |t|
  t.integer  "foo_id"
  t.integer  "blah_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end
add_index "bars", ["foo_id", "blah_id"], :name => "index_bars_on_foo_id_and_blah_id", :unique => true
add_index "bars", ["foo_id"], :name => "index_bars_on_foo_id"
create_table "foos", :force => true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end
add_index "foos", ["name"], :name => "index_foos_on_name"

好!这是因为我们在部分代码中使用了update_attribute,这当然不会运行AR验证。尴尬的脸

相关内容

  • 没有找到相关文章

最新更新