Документация DataMapper рекомендует # attribute_set
Устанавливает значение атрибута и помечает атрибут как грязный, если он был изменен, чтобы его можно было сохранить. Не устанавливайте переменные экземпляра напрямую, а используйте этот метод.
В вашем случае:
before :save do
set_attribute(:birthday => Date.new(self.birthday_year.to_i, self.birthday_month.to_i, self.birthday_day.to_i))
end
Для чего бы это ни стоило, если бы мне не понадобилось использовать все поля в критериях SELECT, я бы сохранил либо целые поля, либо дату, но не оба:
class Order
include Datamapper::Resource
property :birthday, Date
end
# change month
o = Order.create(:birthday => Date.new(...))
o.update(:birthday => Date.new(o.birthday.year, new_month, o.birthday.mday))
Или
class Order
include Datamapper::Resource
property :birthday_day, String
property :birthday_month, String
property :birthday_year, String
def birthday
if self.birthday_day && self.birthday_month && self.birthday_year
Date.new(self.birthday_day, ...)
end
end
end