我在 Rails 中遇到了一个非常奇怪的问题。我正在使用update_attributes
父对象来更新所有子对象。子对象具有(自定义)验证,并且确实可以正常工作,这意味着如果我提供错误的值,验证触发器就会返回错误。
现在我处于一种奇怪的情况,其中一个模型在数据库中无效(我们不要质疑为什么,假设我可以进入数据库并运行一些 SQL 以使模型无效)。如果我进入我的应用程序,我可以看到无效值,这很好。我修复了这些值并再次保存,我可以看到,在保存新值之前也调用了验证的 ruby 代码,这意味着我会得到一个错误,Rails 永远不会执行 SQL 来实际将值更新到正确的。
我希望以上是有道理的。你有什么想法还是你认为我忽略了什么?
解决方案:
发生的事情是多对多关系在被新数据替换之前验证现有数据库数据。基本上结构是这样的:
class User
has_many :user_permissions
has_many :permissions, :through => :model_permissions
class Permission
has_many :user_permissions
has_many :users, :through => :user_permissions
class UserPermission
belongs_to :user
belongs_to :permission
validates_associated :user # THIS was causing the problem
validates_associated :permission # and THIS as well
我只是删除了该validates_associated
指令,因为无论如何我都在独立验证链接的记录。