ActiveRecord验证:关联的唯一性

Dmy*_*iak 9 ruby validation activerecord ruby-on-rails

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

  validates  :user_id, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"}
Run Code Online (Sandbox Code Playgroud)

除了在:user_id密钥上设置错误消息之外,这个工作正常.

我怎么能这样做但是在:user键上设置错误(validates :user给出错误)?

Sea*_*ere 8

这是检查唯一性并强制将错误分配给: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
Run Code Online (Sandbox Code Playgroud)

我认为,如果你能想出一种使用默认验证的方法,那将是更好的选择,:user_id但也许你有一个特殊的用例.

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

errors.add :base, 'already exists'
Run Code Online (Sandbox Code Playgroud)