2009-07-17 4 views
3

나는 자신의 테이블을 가지고있는 구체적인 모델이 자라는 AbstractRecord 모델을 가지고있다. 다음은 상속입니다. 상속이있는 경우 레일 위해서는레일즈 : self.inherited을 효과적으로 사용하는 방법

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

적절한 테이블을 찾기 위해, API 문서는 클래스 메소드의 abstract_class를 정의하는 말? 레일이 테이블을 찾지 않도록 true를 반환합니다. 내 경우, 레일스가 (일반적으로 STI에서와 같이 abstract_records 테이블 대신에) 블로그 테이블을 찾기 위해 abstract_class 메소드를 정의 했습니까? true를 돌려주는 AbstractRecord 모든 쿼리가 제대로 작동하는 것 같습니다. 하지만 Blog를 인스턴스화 할 때마다 레일은 부모 클래스가 true를 반환 할 때 콘솔에서 블로그 (추상)로 표시합니다. 이를 피하기 위해 다시 abstract_class를 정의 할 수 있습니까? 블로그 클래스에서 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 

저에게 잘 돌아갑니다. 테이블 이름은 "accounts"가됩니다.

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

인해 '상속'메소드 이름을 마우스 오른쪽 못하고 아래로 투표! –

+0

@BillEisenhauer 왜 투표를하지 말고 편집을 제안하는 것이 좋을까요? – Nick

+0

@ 닉 잘 모르겠다! 거의 5 년 전에 내가했던 행동에 대해 묻고 있습니다. 그 때 편집을 제안하는 방법을 모르겠다. 아마 그 대답이 정확하지 않고 다른 사람들이 혼란스럽지 않았 음을 알고 싶었을 것입니다. –

관련 문제