2011-12-10 19 views
2

私はStoryChapterという2つのモデルを持っています。ストーリーhas_manyの章のうちの1つは、その最初の章として機能する章です。どのチャプターが最初であるかを示すために、私は外来キー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'のようなチャプターテーブルにフラグを追加するか、それが最初のチャプターかどうかを示すtrueまたはfalseのフラグを追加します。このようにして、chapterのfirst_chapter-nessはコードフィールドの変更から生き残ることができますが、これはちょっと気になります。また

、自分の繰り返しを避けるために、あなたがにhas_oneの宣言を変更することができます:のようなものに起動します。

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

ああ、私は '知りませんでした:through'が参加したモデルのためだけでなく、使用することができ、サブセットも含まれます。それは間違いなくきれいです。 –

+0

...私は開発データベースを再作成した後、CanCanが突然動作を停止したことを除いて。私がより冗長な関係に戻ってしまうと、もう一度うまくいく。どのように奇妙です。 –

関連する問題