我有
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>
答案 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.skin
或self[:skin]
,但我尚未对此进行测试。它确实假设您首先访问皮肤以进行设置,但您可以通过将其与数据库中的默认值相结合来解决此问题。可能存在特定于rails的回调,这将提供更简单的解决方案。
答案 2 :(得分:0)
我认为你需要在做出任何调整之前打电话给超级:
module Skin
def initialize(*)
super
self.skin = "fuzzy"
end
end
class Fruit < ActiveRecord::Base
include Skin
end
未测试。