Ruby DataMapper不保存在挂钩之前设置的属性

时间:2011-03-29 12:41:48

标签: ruby datamapper

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”)

请帮助我理解,之前在模型中有什么问题。

抱歉,我不太好意思。

2 个答案:

答案 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