Как использовать «создать!»метод класса с конструктором, который принимает один аргумент - PullRequest
0 голосов
/ 28 мая 2018

У меня есть класс, который выглядит следующим образом (упрощенно)

class Timereg < ActiveRecord::Base

  def initialize(hour_id)
    super()
    self.hour_id = hour_id
    self.status = -2
    self.slug = SecureRandom.uuid.to_s
  end
end

При его использовании

Timereg.new(1)

все хорошо.

Как я могуиспользуйте это с этим

Timereg.create!

Я не могу понять синтаксис.Я получаю:

ArgumentError: wrong number of arguments (2 for 1)

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Неправильно переопределять методы create или initialize.

Вы должны использовать обратные вызовы .Вы можете использовать after_initialize hook для присвоения значений.

0 голосов
/ 28 мая 2018

Вам необходимо добавить параметр блока:

def initialize(hour_id, &block)
  super(nil, &block)
  ..
end

Вот как выглядит create! ActiveRecord:

# File activerecord/lib/active_record/persistence.rb, line 47
def create!(attributes = nil, &block)
  if attributes.is_a?(Array)
    attributes.collect { |attr| create!(attr, &block) }
  else
    object = new(attributes, &block)
    object.save!
    object
  end
end

Поскольку ваш .new не принимает два параметра,create! терпит неудачу.

Но, как сказал @ kartikey-tanna , сначала не стоит изменять инициализатор.

Рассмотрим что-нибудьнапример:

def self.create_for_hour_id!(hour_id, attributes = nil)
  timereg = new(attributes)
  timereg.hour_id = hour_id
  yield timereg if block_given?
  timereg.save!
  timereg
end

И использовать обратные вызовы для настройки слагов, статуса и т. д .:

before_validation :generate_slug

private
def generate_slug
  self.slug ||= SecureRandom.uuid.to_s
end
...