【问题标题】:ActiveRecord validate :uniqueness on associationActiveRecord 验证:关联的唯一性
【发布时间】:2012-01-05 07:49:40
【问题描述】:

我需要执行验证以确保公司内只有一个用户可以存在于给定类别中。

  validates  :user_id, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"}

除了在:user_id 键上设置错误消息外,此方法有效。

除了在:user 键上设置错误(validates :user 给出错误),我该如何做同样的事情?

【问题讨论】:

  • validates :user, :uniqueness => { ... } ?
  • @Martin 我在问题中提到它会引发错误。建议的副本是一个完全不同的问题。
  • 对不起,这个问题确实完全不同,我应该提到一个可能的解决方案是在这个问题的答案中。
  • 我想它很快就会修复 :) github.com/rails/rails/issues/4321

标签: ruby-on-rails ruby validation activerecord


【解决方案1】:

这是检查唯一性并强制将错误分配给:user 属性的简单方法:

class User < ActiveRecord::Base
  validate :user_unique_per_company_per_category

  private

  def user_unique_per_company_per_category
    if self.class.exists?(:user_id => user_id, :company_id => company_id, :category => category)
      errors.add :user, 'already exists'
    end
  end
end

我认为,如果您能找到一种方法来使用 :user_id 上的默认验证,那会更好,但也许您有一个特殊的用例。

另外,如果您没有在表单中使用它,您可能会考虑将错误分配给:base,因为您可能会混淆那些期望错误出现在:user_id 上的未来开发人员:

errors.add :base, 'already exists'

【讨论】:

  • 是的,到目前为止,客户验证可能是最好的选择。我不敢相信您不能对用户应用此验证 :( 验证 user_id 的问题是它从未在 UI 上使用过,因此您提到的错误消息不会出现在正确的位置。
  • 这在您编辑User 记录时是否也有效?您正在保存的用户已经在数据库中,但如果您正在更新,那没关系。
【解决方案2】:

我认为这是不可能的,因为 ActiveRecord 的 validates 方法将错误发送到正在验证的方法。

因此验证 :user 尝试发送到您的模型中不存在的 :user 的 attr_accessor。

不过,如果您只是想让错误消息更漂亮,您可以:

alias user user_id

然后在验证中使用 :user。

validates  :user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"}

在旁注中,我不会在别名中使用 user 而是类似:

alias the_supplied_user user_id

然后在您的验证中:

validates  :the_supplied_user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"}

【讨论】:

  • 好吧,user 和 user_id 确实存在,因为它是一个关联。所以别名只会破坏一切。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多