Pull to refresh
6
0
Виталий @disyukvitaliy

web-developer

Send message
Здравствуйте
Подобную проблему также можно решить и с помощью модуля ActiveModel::Model
class DailyActiveUsersData
  include ActiveModel::Model

  attr_accessor :app_id, :ad_type, :first_request_date

  validates :app_id, :ad_type, :first_request_date, presence: true
  validates :app_id, numericality: { greater_than: 0 }
  validates :ad_type, inclusion: { in: [:android, :ios] }
  validates :first_request_date, date: true
end

Вы можете сбилдить объект, передав все аргументы в new
DailyActiveUsersData.new(app_id: 1, ad_type: :ios, first_request_date: Time.now)

Либо же наполнять объект в процессе
data = DailyActiveUsersData.new
data.app_id = 1
data.ad_type = :ios

В тот момент, когда вы решаете что новые данные уже не поступят, вы можете вызвать на объекте #validate!.. Теперь вы можете быть уверенным, что объект содержит корректные данные
data.validate!

Чтобы разработчик мог понять, из чего состоит объект, он может просмотреть правила валидации определенные в классе
Если жы мы хотим быть уверенными в том, что невалидного объекта существовать не должно, мы можем сделать следующее
class DailyActiveUsersData
  include ActiveModel::Model

  def self.new!(attrs)
    object = new(attrs)
    object.validate!
    object
  end
end

Ну, или же на крайний случай вот так (правда, я не любитель переопределять такие штуки)
class DailyActiveUsersData
  include ActiveModel::Model

  def initialize(attrs)
    super(attrs)
    validate!
  end
end

P.S. для ad_type я использовал простой inclusion. Естественно это не полноценная замена, например, enum-а
Надеюсь идея кому-то пригодится, хотя она и не нова. В инете много статей на тему использования form object-ов или чего-то подобного.
Действительно. Перечитал ваш комментарий и осознал. Прошу аннулировать мой предыдущий коммент :)
Несомненно, вы правы. Я обязательно поступлю так в следующий раз, когда буду автором оригинала ;)

Information

Rating
Does not participate
Location
Томск, Томская обл., Россия
Registered
Activity