Может ли 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.

Другие вопросы по тегам