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它是模型的一部分,但它是足够的。When save字段(从irb或sinatra应用程序):生日不保存在数据库中。但在irb中,我看到了object,其中:生日存在和日期格式。当更改字段manual (从irb):f.birthday = Date.new f.save in object和In DB result出现时(在obj中显示为日期obj,在数据库中显示为"2010-2-3")
请帮我理解一下,以前的模型有什么问题。
对不起,我的英语不太好。
发布于 2011-03-29 21:09:17
你应该使用属性赋值方法。设置ivar不会触发脏跟踪。只需执行以下操作:
self.birthday = Date.new(birthday_year.to_i, birthday_month.to_i, birthday_day.to_i)此外,最好使用Integer作为year、month和day的属性类型。
发布于 2011-03-29 23:19:02
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
endhttps://stackoverflow.com/questions/5472671
复制相似问题