我在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
指令,因为我无论如何都要独立验证链接记录。
答案 0 :(得分:0)
好吧,Rails会在将数据写入数据库之前运行您的验证(请参阅Active Record callback sequence),因此验证错误意味着您尝试保存的某些模型无效。它可能是一个相关的模型,包含启用验证的错误或只是一些缺失的部分 - 在任何情况下,只需看看你得到的错误。
如果你想要跳过验证,那么你们可以选择#update_attribute(只更新一个属性),调用#save(false),使用+ udpate_all方法模型类甚至可以转到ActiveRecord :: Base.connection.execute - 这些都不会给你带来验证错误:)