加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – has_many关联中的find_or_initialize_by导致重

发布时间:2020-12-17 03:13:48 所属栏目:百科 来源:网络整理
导读:自从我从Rails 3.0.11迁移到3.1.3后,我发现了一个奇怪的错误.这是一个重现错误的独立代码: require 'active_record'ActiveRecord::Base.establish_connection( :adapter = 'mysql2',:username = 'root',:database = "some_development")class User ActiveRe
自从我从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:favorites,:autosave => false而不是has_many:favorites也会删除错误.由于我从不关心自动保存,我甚至不确定:autosave =>假是一个好主意.

我做错了什么,还是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

我认为你发现的是你创造的新宠物是一个单独的对象.因此,你将保存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
==> []

看起来像一个错误 – 见https://github.com/rails/rails/pull/3610

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读