4

我想知道是否只有我一个有这个问题。为了确定这一点,我创建了两个非常基本的模型。

# user.rb
class User < ActiveRecord::Base
  has_one :role, :inverse_of => :user
  accepts_nested_attributes_for :role
end

# role.rb
class Role < ActiveRecord::Base
  belongs_to :user, :inverse_of => :role
  accepts_nested_attributes_for :user
end

在 Rails 控制台中,如果 User 模型已加载,则尝试更新 Role 类的简单属性会失败。

Loading development environment (Rails 3.2.2)
1.9.3-p194 :001 > Role.first.update_attribute(:role_type, 72)
 => true 
1.9.3-p194 :002 > Role.first.tap {|r| r.user}.update_attribute(:role_type, 72)
SystemStackError: stack level too deep
    from /Users/enelson/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb/workspace.rb:80
Maybe IRB bug!

如果我删除任何一个accept_nested_attributes 指令,这个问题就会消失。我想这里的简单答案是“那么,你为什么不摆脱其中一个呢?” 问题是这将涉及重写应用程序中的许多现有页面,如果有不同的修复或解决方法,我想听听。

4

3 回答 3

3

在设计方面,角色“拥有”用户并不是正确的组合。在这个阶段纠正设计可能会更好,而不是离开它。

这两种关系也被定义为彼此的“逆”;这也可能有助于无限递归。

于 2013-05-11T11:53:09.230 回答
1

我遇到了同样的问题,发现了这个:https ://github.com/rails/rails/issues/7809 ,然后是这个拉取请求https://github.com/rails/rails/pull/7824。将它作为猴子补丁添加到项目中,希望它不会引入任何令人讨厌的错误。

于 2014-05-14T13:56:52.820 回答
0

根据文档,您应该accetps_nested_attributes_forRole模型中删除,并保留两个inverse_of.

于 2017-10-02T22:03:39.897 回答