首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails:如何有效地使用self.inherited

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

Stack Overflow用户
提问于 2009-07-17 19:37:28
回答 2查看 4.4K关注 0票数 3

我有一个AbstractRecord模型,其中一些具体的模型(它们有自己的表)下降。以下是继承。

代码语言:javascript
复制
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本身中定义该方法。我试图使用几种方法(如下所示),但似乎没有一种方法有效。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

对我做错了什么有什么建议是值得赞赏的?

EN

回答 2

Stack Overflow用户

发布于 2010-08-14 00:40:10

试试这个:

代码语言:javascript
复制
def self.inherited(subclass)
  super
  def subclass.abstract_class?
    false
  end
end

或者:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2009-10-26 13:34:49

代码语言:javascript
复制
class Account < Foo::Bar::Base
end

module Foo
  module Bar
    class Base < ::ActiveRecord::Base
      def self.abstract_class?
        true
      end
    end
  end
end

对我来说挺好的。它的结果是表名“帐户”,因为它必须是。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1145264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档