使用mixins初始化类变量

时间:2011-09-03 00:38:07

标签: ruby-on-rails ruby

我有

class Fruit < ActiveRecord::Base
    includes Skin
end

和mixin模块

module Skin
    def initialize
        self.skin = "fuzzy"
    end
end

我想要它

>> Fruit.new
#<Fruit skin: "fuzzy", created_at: nil, updated_at: nil>

3 个答案:

答案 0 :(得分:5)

使用ActiveRecord after_initialize回调。

module Skin
  def self.included(base)
     base.after_initialize :skin_init
  end

  def skin_init
    self.skin = ...
  end
end

class Fruit < AR::Base
  include Skin
  ...
end

答案 1 :(得分:0)

尝试为皮肤定义读者/编写器:

module Skin
  def skin
    @skin||="fuzzy"
  end
  attr_writer :skin
end

class Fruit
  include Skin
end

f=Fruit.new
puts f.skin # => fuzzy
f.skin="smooth"
puts f.skin # => smooth

编辑:对于rails,您可能会移除attr_writer行并将@skin更改为self.skinself[:skin],但我尚未对此进行测试。它确实假设您首先访问皮肤以进行设置,但您可以通过将其与数据库中的默认值相结合来解决此问题。可能存在特定于rails的回调,这将提供更简单的解决方案。

答案 2 :(得分:0)

我认为你需要在做出任何调整之前打电话给超级:

module Skin
  def initialize(*)
    super
    self.skin = "fuzzy"
  end
end

class Fruit < ActiveRecord::Base
  include Skin
end

未测试。