使用“has_many :through”进行验证
Posted
技术标签:
【中文标题】使用“has_many :through”进行验证【英文标题】:validate with "has_many :through" 【发布时间】:2012-07-15 06:45:09 【问题描述】:我的用户模型中有validate :my_validate
,但如果“has_may :through”属性发生更改,则永远不会调用my_validate
。这是正确的行为吗?
我的代码:
class User < ActiveRecord::Base
has_many :roles, :through => :user_roles
validate :my_validate
def my_validate
raise 123
end
这会引发异常:
User.find(1).name = 'new_name'
这行得通:
User.find(1).roles = []
我知道用户表没有更新,所以 rails 认为验证没有必要,但它看起来很奇怪。
【问题讨论】:
【参考方案1】:User.find(1).name = 'new_name'
它抛出异常是因为你想为 name 分配一些值并尝试将值保存到 users 表中,在验证方法“my_validate”中你会引发一些错误,这意味着如果你想保存任何值它将抛出一个错误.
User.find(1).roles = []
但在第二种方法中,您为角色表分配了一些值,而不是 用户表。明智的是,它不会引发任何错误。
【讨论】:
“我知道用户表没有更新,所以 rails 认为验证没有必要,但它看起来很奇怪。” 我相信验证不是关于“表格”,而应该是关于“模型”。 “角色”和“名称”都是属性,尽管它们的内部表示形式不同,但它们的行为应该相同。 我的意思是,当您在用户模型中使用保存方法时,它会尝试将数据保存在您的表中,例如 user = User.find(1).name = 'new_name' 和 user.save 那个时间将尝试将数据存储在用户表中。以上是关于使用“has_many :through”进行验证的主要内容,如果未能解决你的问题,请参考以下文章
在“has_many :through”和“has_and_belongs_to_many”之间进行选择
何时在 Rails 中使用“has_many :through”关系?
使用 `:has_many :through` 记录关联处理复选框表单