Я вижу странную ошибку, так как я перешел с 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
попытается INSERT
сохранить ту же запись в таблице favorites
. (Обратите внимание, что в этом примере пара (user_id, site_id) должна быть уникальной в избранном)
Интересно, что если я использую find_or_create
вместо find_or_initialize
, исключений не будет.
В трассировке стека, которую я заметил, вызывается autosave_association
, не знаю почему, но на самом деле has_many :favorites, :autosave => false
вместо has_many :favorites
также устраняет ошибку. Поскольку я никогда не заботился о autosave
, я даже не уверен, является ли :autosave => false
хорошей идеей или нет.
Что я делаю не так, или это ошибка в Rails? Кто-нибудь может дать мне указатель на что посмотреть?