1

I have something like the following code. (Model names changed as they're not important to what's happening.)

The #find_or_create_bar_for_blah_id works fine most of the time. Occasionally it will return nil though and I'm not sure why.

It's some kind of race condition as the problem happens in resque jobs that run as part of our app.

Any clues as to how #find_or_create_bar_for_blah_id could return 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"
chrismcg
  • 1,286
  • 7
  • 11

1 Answers1

1

Doh! This was because we were using update_attribute in part of the code, which of course doesn't run AR validations. embarrassed face

chrismcg
  • 1,286
  • 7
  • 11