经过多次反复试验并寻找现有答案后,我似乎有一个基本的误解,并且希望得到一些澄清和/或指导。
提前注意:我正在使用多表继承,并且有充分的理由这样做,所以不需要引导我回到 STI :)
我有一个基本模型:
class Animal < ActiveRecord::Base
def initialize(*args)
if self.class == Animal
raise "Animal cannot be instantiated directly"
end
super
end
end
和一个子类:
class Bunny < Animal
has_one(:bunny_attr)
def initialize(*args)
attrs = args[0].extract!(:ear_length, :hop_style)
super
self.bunny_attr = BunnyAttr.create!
bunny_attrs_accessors
attrs.each do |key, value|
self.send("#{key}=", value)
end
def bunny_attrs_accessors
attrs = [:ear_length, :hop_style]
attrs.each do |att|
define_singleton_method att do
bunny_attr.send(att)
end
define_singleton_method "#{att}=" do |val|
bunny_attr.send("#{att}=", val)
bunny_attr.save!
end
end
end
end
以及相关的一组数据
class BunnyAttr < ActiveRecord::Base
belongs_to :bunny
end
如果我然后做这样的事情:
bunny = Bunny.create!(name: "Foofoo", color: white, ear_length: 10, hop_style: "normal")
bunny.ear_length
Bunny.first.ear_length
bunny.ear_length 将返回“10”,而 Bunny.first.ear_length 将返回“#<Bunny:0x0..> 的未定义方法 'ear_length'
为什么会这样以及如何获得第二次调用以返回值?