Такой подход не сработает. Методы проверки - это методы класса, которые изменяют сам класс, когда вы пишете метод экземпляра, который вызывается для экземпляра класса при вызове #valid?
.
Если вы хотите динамически добавить существующие проверки в класс, вам нужно создать метод класса:
class User < ApplicationRecord
def self.add_inclusion_validations(hash)
# don't use each_key if you're iterating over both keys and values
hash.each do |key, values|
validates_presence_of key, in: values
end
end
add_inclusion_validations(
foo: %w[foo1 foo2],
bar: %w[bar1 bar2]
)
end
Конечно, вы также можете просто полностью пропустить метод:
class User < ApplicationRecord
{
foo: %w[foo1 foo2],
bar: %w[bar1 bar2]
}.each do |key, values|
validates_presence_of key, in: values
end
end
Если вам вместо этого нужно написать метод проверки, который использует существующую функциональность других проверок, вы бы создали подкласс ActiveRecord::Validator
или ActiveRecord::EachValidator
и использовали там существующие проверки. Но вам действительно нужно начать с чтения руководств и документации по API, чтобы у вас было общее представление о том, как это работает.