为什么Rails update_attributes在保存之前调用验证

时间:2012-11-09 17:39:47

标签: ruby-on-rails validation

我在Rails中遇到了一个非常奇怪的问题。我在父对象上使用update_attributes来更新所有子对象。子对象具有(自定义)验证,实际上这可以正常工作,这意味着如果我给出错误的值验证触发器,我会收到错误。

现在我处于一种奇怪的情况,其中一个模型在数据库中无效(让我们不要问为什么,让我们说我可以进入数据库并运行一些SQL来制作模型无效)。如果我进入我的应用程序,我可以看到无效的值,这很好。我修复了值并再次保存,我可以看到,踩入ruby代码,调用验证也是在保存新值之前,这意味着我将得到一个错误,Rails将永远不会执行SQL来实际更新值到正确的。

我希望上述内容有道理。你有什么想法或者你认为我有什么东西可以忽略吗?

SOLUTION:

发生的事情是多对多关系在被新数据替换之前验证现有的DB数据。基本上结构是这样的:

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

1 个答案:

答案 0 :(得分:0)

好吧,Rails会在将数据写入数据库之前运行您的验证(请参阅Active Record callback sequence),因此验证错误意味着您尝试保存的某些模型无效。它可能是一个相关的模型,包含启用验证的错误或只是一些缺失的部分 - 在任何情况下,只需看看你得到的错误。

如果你想要跳过验证,那么你们可以选择#update_attribute(只更新一个属性),调用#save(false),使用+ udpate_all方法模型类甚至可以转到ActiveRecord :: Base.connection.execute - 这些都不会给你带来验证错误:)