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) ペアはお気に入りで一意である必要があることに注意してください)INSERT
favorites
興味深いことに、find_or_create
代わりに使用するとfind_or_initialize
、例外は発生しません。
スタック トレースで、呼び出されることに気付きましたautosave_association
が、理由はわかりませんが、実際has_many :favorites, :autosave => false
には代わりにhas_many :favorites
エラーも削除されます。私は気にしたことがないので、良いアイデアかautosave
どうかさえわかりません。:autosave => false
何が間違っているのでしょうか、それとも Rails のバグですか? 誰かが私に見るためのポインタを与えることができますか?