Я вижу странную ошибку, так как я перешел с 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? Может ли кто-нибудь дать мне указатель для просмотра?