2009-07-17 52 views
3

我有一个AbstractRecord模型,其中一些具体模型(具有自己的表格)下降。以下是继承。Rails:如何有效地使用self.inherited

AbstractRecord < ActiveRecord::Base 
Blog < AbstractRecord 
Post < AbstractRecord 
.... 
.... 

为了让Rails在继承时寻找合适的表,API文档说要定义一个类方法abstract_class?返回true,以便rails不会查找它的表。在我的情况下,为了让rails查找博客表(而不是abstract_records表,这在STI中通常是这种情况),我定义了方法abstract_class?在AbstractRecord中返回true。所有的查询似乎工作正常。但是当我实例化Blog时,我发现当rails的父类返回true时,rails在控制台中显示为Blog(抽象)。为了避免这种情况,我可以再次定义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 

什么我做错了任何建议表示赞赏?

回答

1
class Account < Foo::Bar::Base 
end 

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

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

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 

+0

否决由于没有得到 '继承' 方法的名字吧! – 2011-10-13 15:24:11

相关问题