2011-12-10 125 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仍然是一個協會,所有的好處(我需要#start爲一個關聯,因爲我使用CanCan和關聯進行授權)。

我的方法有什麼缺點,我現在還沒有意識到,或者我對它比較安全?

回答

2

依靠代碼=='1a'來找到第一章有點過分。我可能會在章表中添加一個標誌,如'first_chapter'或者是否爲真或假,表明它是否是第一章。這樣一章的第一章就會在代碼字段的變化中生存下來,但這有些挑剔。

另外,爲了避免重複自己,你可以改變HAS_ONE聲明:開始是這樣的:

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

哦,我不知道':through'可不僅用於連接模型,也包括子集。這絕對是更清潔。 –

+0

...除了CanCan在重新創建我的開發數據庫後突然停止工作。如果我恢復到更加冗長的關聯,那麼這又很好。多麼奇怪。 –

相關問題