如何使聚合属性支持ActiveRecord :: Dirty语义?

时间:2009-11-05 21:46:11

标签: ruby-on-rails activerecord

我有一个聚合属性,我希望能够询问它的_changed吗?等等。

composed_of :range,
            :class_name => 'Range',
            :mapping => [ %w(range_begin begin), %w(range_end end)],
            :allow_nil => true

如果我使用聚合:

foo.range = 1..10

这就是我得到的:

foo.range                # => 1..10
foo.range_changed?       # NoMethodError
foo.range_was            # ditto
foo.changed              # ['range_begin', 'range_end']

所以基本上,我没有在聚合属性上获得ActiveRecord :: Dirty semanitcs。有没有办法做到这一点?我对alias_attribute_with_dirty等运气不太好。

1 个答案:

答案 0 :(得分:0)

您没有获得ActiveRecord :: Dirty语义,因为聚合属性不是关联代理,仅仅是您实际属性的包装 - 这就是您无法通过它们访问ActiveRecords的原因。

请注意,foo.range_begin_changed? 工作,因此您可以尝试查看是否可以使用foo.class#method_missing(例如,在要包含的模块中定义)来自动映射{ {1}},*_was等方法调用*_changed?的实际属性。