2009-07-17 54 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