Передача значений, не относящихся к атрибутам, в чертеж машиниста

#ruby-on-rails #machinist

#ruby-on-rails #машинист

Вопрос:

Это упрощенный пример того, что я пытаюсь сделать…

Предположим, у меня был объект Person :

 Person.blueprint do
  name
  age
end
 

Я хочу иметь возможность делать что-то вроде этого:

 Person.blueprint(:from_birthdate) do
  name
  age { Time.now - birthdate }
end

Person.make(:from_birthdate, :birthdate => 5.years.ago)
 

Однако мне не разрешено передавать значения, make которые не являются фактическими атрибутами Person объекта. Есть ли способ передать произвольный объект в чертеж?

Ответ №1:

Вы могли бы сделать attr_accessor for birthdate , но это кажется немного глупым. Возможно, вам потребуется просто определить отдельный метод:

 def Person.make_from_birthdate(attributes)
  birthdate = attributes.delete :birthdate
  Person.make attributes.merge(:age => Time.now - birthdate)
end
 

Однако хранение возраста, как правило, является плохой практикой. Поскольку возраст меняется со временем, а дата рождения — нет, обычно вы хотите сохранить дату рождения в БД и вычислить возраст (на основе сегодняшней даты) по мере необходимости.

Комментарии:

1. Я согласен, что это не очень хороший способ хранения возраста. На самом деле я делаю что-то другое, но возраст намного легче объяснить.

2. В будущем, пожалуйста, используйте пример кода, который максимально приближен к вашему реальному варианту использования. Поддельные примеры, как правило, приводят к плохим ответам для реальных вариантов использования.