ken*_*enn 5 activerecord autosave ruby-on-rails associations ruby-on-rails-3.1
自从我从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!
Run Code Online (Sandbox Code Playgroud)
最终会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 bug?任何人都可以给我一个指针来看看吗?
你试过不打电话f.save!吗?u.save!应保存收藏夹和用户.
> f = u.favorites.find_or_initialize_by_site_id(123)
> u.favorites.include?(f)
==> false
> f2 = u.favorites.build(:site_id => 123)
> u.favorites.include?(f2)
==> true
Run Code Online (Sandbox Code Playgroud)
我认为你发现的是f你创造的新宠物是一个单独的对象.因此,你将保存f,而另外还有另一个未保存的喜欢u.favourites.因此,当您保存u(也保存收藏夹)时会发生非唯一错误
我不确定这是否是Rails 3.1中新引入的错误.这可能是故意的.
在Rails 3.0中,find_or_initialize_by没有填充数组
> f = u.favorites.find_or_initialize_by_site_id(123)
> u.favorites
==> []
Run Code Online (Sandbox Code Playgroud)
看起来像一个错误 - 请参阅https://github.com/rails/rails/pull/3610
| 归档时间: |
|
| 查看次数: |
8523 次 |
| 最近记录: |