自从我从 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 错误?谁能给我指点看看?