使用“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 和 build

使用 `:has_many :through` 记录关联处理复选框表单

在 Rails 4 中使用 has_many :through :uniq 时的弃用警告

Rails RSpec 测试 has_many :through 关系