0

我在 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指令,因为无论如何我都在独立验证链接的记录。

4

1 回答 1

0

好吧,Rails 在将数据写入数据库之前会运行您的验证(请参阅Active Record 回调序列),因此出现验证错误意味着您尝试保存的模型的某些部分无效。它可能是一个关联模型,其中包含启用验证的错误,或者只是一些缺失的部分——无论如何,看看你得到的错误是什么。

万一(让我们毫无疑问:)您想跳过验证 - 您可以选择#update_attribute(仅更新一个属性),调用#save(false),使用模型类的+udpate_all方法,甚至去一直到 ActiveRecord::Base.connection.execute——这些都不会因为验证错误而困扰你 :)

于 2012-11-09T17:47:03.897 回答