ActiveRecord validate: уникальность при ассоциации - PullRequest
8 голосов
/ 05 января 2012

Мне нужно выполнить проверку, чтобы убедиться, что в данной категории может существовать только один пользователь в компании.

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

Это работает, за исключением того, что сообщение об ошибке установлено на ключе :user_id.1005 *

Как я могу сделать то же самое, но установить ошибку на клавишу :user (validates :user выдает ошибку)?

Ответы [ 2 ]

8 голосов
/ 05 января 2012

Вот простой способ проверить уникальность и принудительно назначить ошибку атрибуту :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'
0 голосов
/ 05 января 2012

Я не думаю, что это возможно, поскольку метод validates ActiveRecord отправляет ошибки проверяемому методу.

Итак, validates: пользователь пытается отправить в 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"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...