2012-03-08 2 views
1

이것은 매우 기본적인 질문입니다. 나는 루비를 처음 사용하기 때문에 약간의 도움을 주시면 감사하겠습니다.Ruby ActiveRecord 2 레벨 join

내 데이터베이스, 소스, SourceType 및 피드에 3 개의 테이블이 있습니다. 모든 소스는 SourceType에 속하며 Every Feed는 소스에 속합니다. 이들의 기본 키는 SourceID, 유형 ID를하고

내 액티브 레코드 클래스는 FeedID : 나는 소스와 SOURCETYPE에서 SourceFeed, 물건에서 물건을 선택하려고

class SourceFeed < ActiveRecord::Base 
    self.table_name = "SourceFeed" 
    self.primary_key = "FeedID" 

    belongs_to :Source, 
    :foreign_key => "SourceID", 
    :class_name => "Source", 
    :include => "SourceType" 
end 

class Source < ActiveRecord::Base 
    self.table_name = "Source" 
    self.primary_key = "SourceID" 

    has_many :SourceFeeds, 
    :primary_key => "SourceID", 
    :class_name => "SourceFeed" 

    belongs_to :SourceType, 
    :foreign_key => "TypeID", 
    :class_name => "SourceType" 
end 

class SourceType < ActiveRecord::Base 
    self.table_name = "SourceType" 
    self.primary_key = "TypeID" 

    has_many :Source, 
    :primary_key => "TypeID", 
    :class_name => "Source" 
end 

. 여기에 쿼리 :

feed = SourceFeed.select("SourceFeed.FeedID, Source.Name as SourceName, SourceType.Name as SourceType").joins(:Source, :SourceType).where(:FeedID => FeedID).first 

조인에서 내가 그것을 제거하면 나는 Association named 'SourceType' was not found; perhaps you misspelled it? 오류

을 얻고, 나는 Unknown column 'SourceType.Name' in 'field list' 오류가 발생합니다.

옳은 방법은 무엇입니까?

감사

PS : 내 데이터베이스 명명 규칙 활동 기록을 따르지 않는,하지만 난 기존 DB 함께 일하고 있음을 변경할 수 없습니다.

답변

1

쿼리는 SourceFeed에 정의 된 "SourceType"이라는 연결이있는 경우에만 작동합니다. 당신은 그것을 가지고 있지 않습니다, 그래서 당신은 오류가 있습니다. 나는이 일을해야한다고 생각 :

feed = SourceFeed.select("SourceFeed.FeedID, Source.Name as SourceName, SourceType.Name as SourceType").joins(:Source).joins("JOIN SourceType ON SourceType.TypeID = Source.TypeID").where(:FeedID => FeedID).first 

UPDATE : 확실히, 데릭 Harmel의 대답은 하나 더있다. SQL은 가능할 때마다 피해야합니다.

+0

덕분에 :) 두 번째 조인은'joins ("JOIN SourceType ON SourceType.TypeID = Source.TypeID")' – applechief

5

시도는이 변화 당신의 연결 이름은 아마 모델 정의에서 소문자로해야한다고 언급한다, 또한

.joins(:Source => :SourceType) 

.joins(:Source, :SourceType) 

에서 인수를 결합한다.

+0

을 읽어야합니다. 감사. 소문자로 변환하는 것이 관례입니까 아니면 영향을 미치나요? – applechief

+1

대회는 확실하지만 일부 결과도있을 수 있지만 확실히 말할 수는 없습니다. 일반적으로 루비는 상수, 클래스 및 모듈을 대문자로 유지합니다. 당신은 재미있는보고있는 코드로 끝날 것입니다. source.SourceType은 분명히 관용적이지 않습니다. –

+0

답변입니다! 고마워 데릭! – andy