Ruby DataMapper 不保存钩子(Hook)前设置的属性

标签 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 应用程序)时:生日不保存在数据库中。但是在 irb 中,我看到对象,其中:生日存在并且它是日期格式。 更改现场手册时(来自 irb): f.birthday = Date.new 日期 f.保存 在对象和数据库中结果出现(在对象中作为日期对象,在数据库中作为“2010-2-3”)

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

对不起,我的英语不好。

最佳答案

您应该使用属性修改器方法。设置 ivar 不会触发脏跟踪。只需这样做:

self.birthday = Date.new(birthday_year.to_i, birthday_month.to_i, birthday_day.to_i)

另外,年月日的属性类型最好使用Integer。

关于Ruby DataMapper 不保存钩子(Hook)前设置的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5472671/

相关文章:

javascript - 在浏览器中嵌入 ruby​​ 解释器

mysql - 使用 DataMapper 选择随机数据

ruby - 使用 Datamapper 和 Sinatra 进行简单搜索

php - Codeigniter datamapper 一对多关系

ruby - 为什么我的散列具有映射到多个值的相同键?

ruby - Mongoid 3.1.4 调用 'has_key?' 时未定义方法 'Document.create'

ruby-on-rails - Rails PostgreSQL - 更改套接字名称/位置

ruby-on-rails - self 在 Rails 模型中的值(value)是什么?为什么没有明显的实例方法可用?

ruby - 使用 sinatra,我如何从 3 个单独的输入框构造一个正确的 DateTime 值?

mysql - 使用 DataMapper 创建 MySQL 触发器