2017-02-21 26 views
1

У меня есть модель Outlet, которая имеет проверку включения, которая допускает пару значений, и что я буду искать расширение, чтобы иметь больше значений.Как вернуть список элементов, которые пройдут проверку

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

class Outlet < ApplicationRecord 
    belongs_to :user 
    has_many :comments 

    validates :category, :title, :body, :urgency, :user, presence: true 
    validates :title, length: { in: 1..60 } 
    validates :body, length: { in: 1..1000 } 
    validates :urgency, numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 10 } 
    validates :category, inclusion: { in: ['vent', 'rant', 'qualm'] } 
end 

ответ

2

ActiveModel метод класса validators_on возвращает все валидаторы для данной области. Например .:

Outlet.validators_on(:category) 
#=> [#<ActiveRecord::Validations::PresenceValidator:0x007fd2350e4b88 ...>, #<ActiveModel::Validations::InclusionValidator:0x007fd23a872cd8 ...>] 

Это позволяет получить значение включения, как это:

Outlet.validators_on(:category) 
    .find { |validator| validator.is_a?(ActiveModel::Validations::InclusionValidator) } 
    .options[:in] 

Она возвращает массив опций.

Но уборщик способ добиться того же будет извлекать варианты постоянная класса:

class Outlet < ApplicationRecord 
    ALLOWED_CATEGORIES = %w(vent rant qualm).freeze 

    # ... 

    validates :category, inclusion: { in: ALLOWED_CATEGORIES } 
end 

Затем доступ допускаемых значений через Outlet::ALLOWED_CATEGORIES

+0

Великой информацию. Спасибо! –