3

단일 테이블 상속을 사용하는 카드 게임 응용 프로그램이 있습니다. 나는 class Card이고, 데이터베이스 테이블 cardstype이고, 서브 클래스 수는 Card입니다 (인수를 위해서 class Foo < Cardclass Bar < Card 포함).레일 : 단일 테이블 상속 및 모델 하위 디렉터리

Foo은 게임 원본 인쇄 카드이고 Bar은 확장 카드입니다. 내 모델을 합리화하기 위해, 나는 그래서 같은 디렉토리 구조를 만들었습니다

app/ 
+ models/ 
    + card.rb 
    + base_game/ 
    + foo.rb 
    + expansion/ 
    + bar.rb 

그리고 수정으로 environment.rb을 포함 :

Rails::Initializer.run do |config| 
    config.load_paths += Dir["#{RAILS_ROOT}/app/models/**"] 
end 

그러나, 내 응용 프로그램이 데이터베이스에서 카드를 읽을 때

ActiveRecord::SubclassNotFound (The single-table inheritance mechanism failed to locate the subclass: 'Foo'. This error is raised because the column 'type' is reserved for storing the class in case of inheritance. Please rename this column if you didn't intend it to be used for storing the inheritance class or overwrite Card.inheritance_column to use another column for that information.)

는이 작품을 만들기 위해, 또는 내가 플랫 디렉토리 구조에 운명입니다 가능 : 레일은 다음과 같은 예외를 throw?

답변

2

BaseGame 모듈 안에 Foo 클래스를 중첩하는 것이 가장 좋은 방법 일 것입니다.

루비 모듈은 다른 언어의 패키지 구조와 비슷하지만 관련된 비트의 비트를 논리적 그룹으로 분할하는 메커니즘입니다. 믹스 인 (여기에서 설명하는 것을 찾을 수 있습니다 : http://www.rubyfleebie.com/an-introduction-to-modules-part-1/)과 같은 다른 기능이 있지만이 경우에는 관련이 없습니다.

클래스를 약간 다르게 참조하고 인스턴스화해야합니다.

BaseGame::Foo.find(:all,:conditons => :here) 

을 또는 이런 식의 인스턴스를 생성 : 예를 들어, 당신은 이런 식으로 쿼리를 줄

BaseGame::Foo.new(:height => 1) 

레일은 액티브 레코드 모델의 모듈화 된 코드를 지원합니다. 클래스가 저장된 위치를 약간 변경해야합니다.

app/ 
+ models/ 
    + card.rb #The superclass 
    + base_game/ 
     + foo.rb 

클래스에 선언하려면, 당신이 파일 트리 모양을 것 낭포 apps/models/base_game/foo.rbapps/models/foo.rb를 이동해야 당신이 (당신의 예에서와 같이) 모듈 BaseGame로 클래스 푸 이동 예를 들어 말 다음과 같이 정의하십시오 :

module BaseGame 
    class Foo < Card 
    end 
end 
+0

나는 두려움을 가지고 있습니다. "Foo 클래스를 Card 모듈 안에 중첩"한다는 의미에 대해 더 많은 설명 (일부 스텁 코드는 좋을 것입니다)을 게시 할 수 있습니까? 당신은 나머지 대답에서 그것을 언급하지 않는 것 같습니다. – Chowlett

+0

나는 너를 이해하고 있다고 생각한다. 너의 첫 줄에 "BaseGame module 안에"있다는 뜻이야? 이렇게하면 데이터베이스의 유형 열에 무엇이 포함되어야합니까? "Foo"또는 "BaseGame :: Foo"? – Chowlett

+0

@Chris, 예, 당신 말이 맞습니다. type 컬럼에 "BaseGame :: Foo"로 기록됩니다. 그러나 이것을 명시해서는 안되며, 레일스가 모든 것을 처리 할 것입니다. – Ceilingfish

관련 문제