2011-12-10 2 views
2

두 모델 StoryChapter이 있습니다. 이야기 has_many 챕터 중 하나는 첫 챕터로 사용되는 장입니다. 나는 어떤 장이 첫 번째인지를 나타 내기 위해 외래 키 start_id을 이야기 테이블에 가지고있었습니다. Hovewer는 데이터베이스 스키마를 약간 변경해야했지만 이제는 모든 장이 code입니다. 코드가 '1a' 인 경우 해당 장을 소유 한 스토리의 첫 번째 장이됩니다. 다음ActiveRecord has_one 및 has_many : foreign_key

#create_start을 포함하여, 작동하는 것 같다 :

has_many :chapters, :dependent => :destroy, :inverse_of => :story 
has_one :start, :class_name => 'Chapter', :foreign_key => 'story_id', :conditions => {:code => '1a'} 

이 방법은, 외래 키 테이블이 필요없는 것입니다 이야기의 start_id#start 여전히 모든 혜택과 관련, 남아 (I는 다음과 같이 #start 필요 나는 연관을 가지고 CanCan을 사용하기 때문에 협회입니다.)

내 접근 방식에는 현재 실현하지 못한 단점이 있습니까? 아니면 비교적 안전합니까?

답변

2

첫 번째 장을 찾으려면 == '1a'코드를 사용하십시오. 아마도 'first_chapter'와 같은 장 테이블에 플래그를 추가하거나 첫 장인지 여부를 나타내는 true 또는 false를 추가 할 것입니다. 이 방법으로 chapter의 first_chapter-ness는 코드 필드의 변경에서 생존 할 수 있지만 이것은 약간의 애정입니다.

has_one :start, :through => :chapters, :conditions => { :code => '1a' } 
+0

아, 나는 몰랐다 ': 같은 것으로 시작합니다

는 또한, 당신은 has_one의 선언을 변경할 수 있습니다, 자신을 반복하지 않도록하는 through'는 사용할 수없는 모델 만 가입을 위해, 뿐만 아니라 부분 집합입니다. 그건 분명히 깨끗합니다. –

+0

... 내 개발 데이터베이스를 다시 만든 후 갑자기 CanCan이 작동을 멈췄습니다. 만약 내가 좀 더 장황한 관계로 되돌아 간다면, 다시 좋을 것입니다. 얼마나 이상합니다. –