#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. В будущем, пожалуйста, используйте пример кода, который максимально приближен к вашему реальному варианту использования. Поддельные примеры, как правило, приводят к плохим ответам для реальных вариантов использования.