find_or_initialize_by в ассоциации has_many вызывает повторяющуюся ошибку

Я вижу странную ошибку, так как я перешел с Rails 3.0.11 на 3.1.3. Вот автономный код для воспроизведения ошибки:

require 'active_record'

ActiveRecord::Base.establish_connection(
  :adapter  => 'mysql2',
  :username => 'root',
  :database => "some_development"
)

class User < ActiveRecord::Base
  has_many :favorites
end

class Favorite < ActiveRecord::Base
  belongs_to :user
end

u = User.create

# f = u.favorites.find_or_create_by_site_id(123)      #=> pass
f = u.favorites.find_or_initialize_by_site_id(123)    #=> fail
f.some_attr = 'foo'
f.save!

u.name = 'bar'
u.save!                # ActiveRecord::RecordNotUnique will be thrown here!

закончится тем, что ActiveRecord :: RecordNotUnique попытается ВСТАВИТЬ ту же запись в таблицу избранное . (Примечание. что в этом примере пара (user_id, site_id) должна быть уникальной в избранном)

Интересно, что если я использую find_or_create вместо find_or_initialize , никаких исключений не возникает.

В трассировка стека, которую я заметил, вызывается autosave_association , не знаю почему, но на самом деле has_many: избранное,: autosave => false вместо has_many: избранное удаляет ошибка тоже. Так как я никогда не заботился о автосохранении , я даже не уверен, что : autosave => false хороший i деа или нет.

Что я делаю не так, или это ошибка Rails? Может ли кто-нибудь дать мне указатель для просмотра?

5
задан kenn 10 January 2012 в 04:26
поделиться