我有一个AbstractRecord模型,其中一些具体的模型(它们有自己的表)下降。以下是继承。
AbstractRecord < ActiveRecord::Base
Blog < AbstractRecord
Post < AbstractRecord
....
....为了让Rails在有继承的情况下寻找合适的表,API文档说要定义一个类方法abstract_class?返回true,这样rails就不会查找它的表。在我的例子中,为了让rails查找blogs表(而不是abstract_records表,这通常是STI中的情况),我定义了方法abstract_class?在AbstractRecord中返回true。所有的查询似乎都很好。但是,每当实例化Blog时,rails就会在控制台中显示为Blog (抽象),因为它的父类返回true。为了避免这种情况,我可以再次定义abstract_class?在Blog类中返回false。
但我在想,而不是定义abstract_class?在所有子模型中,如果我能够以某种方式使用self.inherited并在AbstractClass本身中定义该方法。我试图使用几种方法(如下所示),但似乎没有一种方法有效。
class AbstractRecord < ActiveRecord::Base
def self.abstract_class?
true
end
def self.inherited(subclass)
super
subclass.instance_eval do
define_method(:abstract_class?) { false }
end
end
endclass AbstractRecord < ActiveRecord::Base
def self.abstract_class?
true
end
def self.inherited(subclass)
super
subclass.class_eval do
define_method(:abstract_class?) { false }
end
end
endclass AbstractRecord < ActiveRecord::Base
def self.abstract_class?
true
end
def self.inherited(subclass)
super
subclass.instance_eval do
def abstract_class?
false
end
end
end
endclass AbstractRecord < ActiveRecord::Base
def self.abstract_class?
true
end
def self.inherited(subclass)
super
subclass.class_eval do
def abstract_class?
false
end
end
end
end对我做错了什么有什么建议是值得赞赏的?
发布于 2010-08-14 00:40:10
试试这个:
def self.inherited(subclass)
super
def subclass.abstract_class?
false
end
end或者:
def self.inherited(subclass)
super
subclass.class_eval do
def self.abstract_class?
# You lost the 'self' part, so you had just defined an instant method for the subclass
false
end
end
end发布于 2009-10-26 13:34:49
class Account < Foo::Bar::Base
end
module Foo
module Bar
class Base < ::ActiveRecord::Base
def self.abstract_class?
true
end
end
end
end对我来说挺好的。它的结果是表名“帐户”,因为它必须是。
https://stackoverflow.com/questions/1145264
复制相似问题