【问题标题】:validate with "has_many :through"使用“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 认为验证没有必要,但它看起来很奇怪。

【问题讨论】:

    标签: ruby-on-rails validation orm associations


    【解决方案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 那个时间将尝试将数据存储在用户表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2019-03-04
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多