Подтвердить что ты не робот

Rails 3 проверяет включение при использовании find (как для proc или лямбда)

У меня есть проект, где есть таблица CURRENCY и COUNTRY. Там 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} - но потом получите ошибку, на которую объект не отвечает?

4b9b3361

Ответ 1

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

Он не должен принимать 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

Ответ 2

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

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

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

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

def all_codes
  ['some', 'dynamic', 'result', 'based', 'upon', 'the', 'record']
end