如何将ActiveRecord属性助手方法添加到虚拟属性?

时间:2012-03-06 16:37:07

标签: ruby-on-rails-3

ActiveRecord提供属性辅助方法,例如_?和“脏”方法(_changed?等)。

是否有Rails方法在非持久或“虚拟”属性上定义这些相同的方法?

我希望有类似的东西:

class MyClass < ActiveRecord::Base

  some_macro :my_attribute

end


$ @my_class = MyClass.new
$ @my_class.my_attribute? # => false
$ @my_class.my_attribute_changed? # => false

1 个答案:

答案 0 :(得分:1)

这当然是调查有趣的事情。显然没有直接的方法来做到这一点......这里有两件我发现的事情

From 2009

From 2011 - reinforces the 2009 post但让它更清洁一点。您创建一个更新属性哈希的模块。来自Brandon Weiss的帖子:

# app/models/dirty_associations.rb
module DirtyAssociations
  attr_accessor :dirty

  def make_dirty(record)
    self.dirty = true
  end

  def changed?
    dirty || super
  end
end

# app/models/lolrus.rb
class Lolrus
  include DirtyAssociations

  has_and_belongs_to_many :buckets,
                          :after_add    => :make_dirty,
                          :after_remove => :make_dirty
end

还有这个插件mentioned here,但我不确定它对你有多大用处。