Rails 3 проверяет включение при использовании find (как proc или lambda) - PullRequest
27 голосов
/ 18 февраля 2011

У меня есть проект, в котором есть таблица ВАЛЮТА и СТРАНА.Существует модель PRICE, для которой требуется действительная валюта и код страны, поэтому у меня есть следующая проверка:

validates :currency_code, :presence => true, :inclusion => { :in => Currency.all_codes }
validates :country_code, :presence => true, :inclusion => { :in => Country.all_codes }

Метод all_codes возвращает массив только кодов валюты или страны.Это прекрасно работает, если в таблицу не добавлено никаких кодов.

Как бы вы написали это так, чтобы результат Currency.all_codes был либо Proc, либо внутри лямбды?Я пробовал Proc.new {Currency.all_codes} - но потом получаю ошибку, на которую объект не отвечает, включает?

Ответы [ 2 ]

63 голосов
/ 01 апреля 2012

Просто используйте процедуру, например:

validates :currency_code,
          :presence => true,
          :inclusion => { :in => proc { Currency.all_codes } }
validates :country_code,
          :presence => true,
          :inclusion => { :in => proc { Country.all_codes } }

Стоит отметить, что для любого другого, кто может наткнуться на это, у протокола также есть запись, доступная в качестве параметра. Таким образом, вы можете сделать что-то вроде этого:

validates :currency_code,
          :presence => true,
          :inclusion => { :in => proc { |record| record.all_codes } }

def all_codes
  ['some', 'dynamic', 'result', 'based', 'upon', 'the', 'record']
end
4 голосов
/ 18 февраля 2011

Примечание: этот ответ верен для старых версий Rails, но для Rails 3.1 и выше, принимаются проки.

Он не должен принимать Procs. Вы можете использовать пользовательский метод проверки, чтобы сделать то же самое:

validate :currency_code_exists

def currency_code_exists
    errors.add(:base, "Currency code must exist") unless Currency.all_codes.include?(self.currency_code)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...