Я создал специальный валидатор в Rails 3.0, который проверяет, является ли комбинация столбцов уникальной в таблице. Весь код проверки:
class UniqueInProjectValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
unless object.class.where("project_id = ? AND #{attribute} = ?", object.project_id, value).empty?
if object.new_record?
object.errors[attribute] << (options[:message] || "must be unique in each project")
else
orig_rec = object.class.find(object.id)
if value != orig_rec.method(attribute).call || object.project_id != orig_rec.project_id
object.errors[attribute] << (options[:message] || "must be unique in each project")
end
end
end
end
Обратите внимание, что нелегко распознать, что делают операторы if, поэтому я надеялся, что смогу заменить условное выражение unless
на метод def attribute_and_project_exist?
, а второе выражение if
на метод def attribute_or_project_changed?
, Однако при создании этих методов аргументы validates_each
не передаются из-за инкапсуляции.
Теперь вопрос: есть ли способ как-то чисто разрешить доступ к этим переменным двумя моими недавно созданными методами, как можно сделать с именами столбцов в модели, или я застрял с вариантами передачи каждого аргумента снова или оставить трудно читаемые условные высказывания?
Заранее спасибо!