class Order
include Datamapper::Resource
property :birthday_day, String
property :birthday_month, String
property :birthday_year, String
property :birthday, Date
before :save do
@birthday = Date.new(@birthday_year.to_i, @birthday_month.to_i, @birthday_day.to_i)
end
end
这是模特的一部分,但它很棒。 保存字段(来自irb或来自sinatra应用程序):生日不保存在DB中。但是在irb中,我看到了对象,其中:生日存在且日期格式。 当更改字段手册(来自irb): f.birthday = Date.new f.save 在对象和DB结果中出现(在obj中作为Date obj,在DB中作为“2010-2-3”)
请帮助我理解,之前在模型中有什么问题。
抱歉,我不太好意思。
答案 0 :(得分:4)
你应该使用属性mutator方法。设置ivar不会触发脏跟踪。就这样做:
self.birthday = Date.new(birthday_year.to_i, birthday_month.to_i, birthday_day.to_i)
最好使用Integer作为年,月和日的属性类型。
答案 1 :(得分:3)
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