Rails:如何有效地使用self.inherited

时间:2009-07-17 19:37:29

标签: ruby-on-rails

我有一个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

对我做错的任何建议表示赞赏?

2 个答案:

答案 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

这对我来说很好。它导致表名称“帐户”必须是。