Может ли validate_uniqueness_of работать с пользовательскими областями?
Я работаю над проектом RoR, и я хотел бы проверить уникальность одной из моих моделей, которая проверяет соответствие пользовательской области:
class Keyword < ActiveRecord::Base
belongs_to :keyword_list
scope :active, -> { where("expiration > ?", DateTime.now) }
validates :name, uniqueness: { scope: [:active, :keyword_list_id] }
end
Только это не работает. Он проверяет базу данных на наличие активного столбца, который не существует, и выдает эту ошибку:
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column keywords.active does not exist
Итак, мой вопрос, есть ли способ заставить это работать, или я должен написать собственный валидатор? И если да, есть ли какие-нибудь советы о том, как должно выглядеть слишком сильное попадание в базу данных?
1 ответ
Нет, вам придется написать пользовательскую проверку.
Попробуй это.
# In app/models/keyword.rb
validate :freshness
private
def freshness
if Keyword.active.find_by(name: self.name, keyword_list_id: self.keyword_list_id)
errors.add(:base, "Name is not fresh enough.") # Fails the validation with error message
end
end
Вот еще один интересный момент, на который нельзя положиться validates_uniqueness_of
или любой другой валидатор уникальности в рельсах, потому что валидации не выполняются атомарно, это означает, что если две идентичные записи вставляются одновременно, и нет ограничения SQL, проверяющего уникальность, валидации ruby пройдут, и обе записи будут вставлены.
Здесь я пытаюсь сказать, что если ваши проверки критически важны, используйте ограничение SQL.