首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby DataMapper不保存在挂接前设置的属性

Ruby DataMapper不保存在挂接前设置的属性
EN

Stack Overflow用户
提问于 2011-03-29 20:41:48
回答 2查看 1.3K关注 0票数 2
代码语言:javascript
复制
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")

请帮我理解一下,以前的模型有什么问题。

对不起,我的英语不太好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-29 21:09:17

你应该使用属性赋值方法。设置ivar不会触发脏跟踪。只需执行以下操作:

代码语言:javascript
复制
self.birthday = Date.new(birthday_year.to_i, birthday_month.to_i, birthday_day.to_i)

此外,最好使用Integer作为year、month和day的属性类型。

票数 4
EN

Stack Overflow用户

发布于 2011-03-29 23:19:02

DataMapper文档建议使用#attribute_set

设置属性的值,如果属性已更改,则将其标记为脏,以便可以保存。不要直接从实例变量设置,而是使用此方法。

在您的案例中:

代码语言:javascript
复制
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条件中的所有字段,否则我会保存整型字段或日期字段,而不是两者都保存:

代码语言:javascript
复制
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))

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5472671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档