Rails проверяет только инкрементное значение - PullRequest
0 голосов
/ 12 января 2020

Существует ли проверка активной записи, чтобы проверить, больше ли добавляемая запись или равна ли она какой-либо другой записи, уже имеющейся в базе данных? Я имею в виду что-то вроде:

class Reading < ApplicationRecord
  belongs_to :register
  validates :kwh, presence: true, numericality: {greater_than_or_equal_to: "any kwh in database"}
end

Если не существует такого способа сделать это таким образом, использование validates_with :

class Reading < ApplicationRecord
  belongs_to :register
  validates_with IncrementalValidator
end

class IncrementalValidator < ActiveModel::Validator
  def validate(record)
    @reading = Reading.order("created_at").last
    if record < @reading
      record.errors[:base] << "This recored is not incremental"
    end
  end
end

является моим лучший вариант?

1 Ответ

1 голос
/ 13 января 2020

Просто используйте пользовательский валидатор:

class Reading < ApplicationRecord
  validates :kwh, presence: true
  validate :validate_kwh_is_the_greatest

  def validate_kwh_is_the_greatest
    # stop validation if kwh is NULL or no record exists with greater value
    return if kwh.nil? || !self.class.where(self.class.arel_table[:kwh].gteq(kwh)).exists?

    errors.add :kwh, "kwh must be greater than the one stored in existing records"
  end
end

Краткое объяснение:

Использование таблицы Ареля следующим образом ...

self.class.where(self.class.arel_table[:kwh].gteq(42)).exists?
# Reading.where(Reading.arel_table[:kwh].gteq(42)).exists?

... аналогично написать:

self.class.where('readings.kwh >= ?', 42).exists?
# Reading.where('readings.kwh >= ?', 42).exists?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...