我有一个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
end
class 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
end
class 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
end
class 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
对我做错的任何建议表示赞赏?
答案 0 :(得分:2)
试试这个:
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
答案 1 :(得分:1)
class Account < Foo::Bar::Base
end
module Foo
module Bar
class Base < ::ActiveRecord::Base
def self.abstract_class?
true
end
end
end
end
这对我来说很好。它导致表名称“帐户”必须是。