2010-12-04 14 views
2

Ruby on Railsを初めて使用しているので、モデル関連についてあまりよく分かりません。しかし、ここに私の問題があります:Ruby on Rails - has_many "kind"に基づいて

私は "has_many:items"というプロジェクトリソースを持っています。各項目には名前と種類があります(その種類は項目の種類を指定します)。私はこのような... - 値「種類」に基づいて、異なる団体を作りたい:

class Item < ActiveRecord::Base 
    belongs_to :project, :dependent => :destroy 

    has_many :sports, :class_name => 'NormalSport' # if kind = 'normal_sport' 
    has_many :sports, :class_name => 'SuperSport' # if kind = 'super_sport' 
    has_many :sheep # if kind = 'sheep' 
    has_many :drinks # if kind = 'drink' 
end 

ので、この項目は「normal_sport」、「super_sport」、「羊」または「どちらかとすることができる意味しますドリンク"。アイテムは、私が言うことができるようにしたいと思いnormal_sport(のようなもの)であれば:その後、

Project.first.items.first.sports.all 

そして「スポーツ」「NormalSport」のクラスになります。

これは誤った方法です。私は多相協会を見ていましたが、それはそのような関連性のようには見えません。これはどの団体ですか? 「アイテム」はちょうど「中型マンモデル」なのですか?

ありがとうございます! (と私の悪い英語のため申し訳ありません)


敬具 アレクサンダー

は、両方の答えをいただき、ありがとうございます。しかし、ルートが気に入らないようです。私は(アイテム-部分プロジェクトのすべての項目をループ内)のような何かを言う場合:

<%= link_to 'Destroy', [@project, item], :confirm => 'Are you sure?', :method => :delete %> 

それ希望、それまでのように動作しません。

/projects/1/super_sport/4 

そして、それは「羊」-itemであれば、それは

/projects/1/sheep/5 

私はどのように言うことができ、それらのものに行く:それは「スーパースポーツ」-itemであれば、それはURLを使用していますALLは次の場所に移動する必要があります。

/projects/:project_id/items/:item_id 

これらはすべてItemsControllerを使用します。彼らがすべてこのルートを使うことができればうれしいでしょう。私はこのハックで試しました:しかし、検証は中断します。私はあなたが私の問題を理解して欲しいです

答えて

0

多型関連がニーズに合わない場合は、「Single table inheritance(STI)」も参照できます。

もう1つのアプローチは、子モデルの選択にスコープを定義することです。

4

STIが必要なように見えるので、共有機能を持つ基本クラスがありますが、継承するモデルのタイプは異なります。 STIは、実装が容易である:

class Sport < ActiveRecord::Base 
    belongs_to :item 
end 

class NormalSport < Sport 
end 

class SuperSport < Sport 
end 

class Item < ActiveRecord::Base 
    has_many :sports 
    has_many :normal_sports 
    has_many :super_sports 
end 

正しいクラスを使用することにより、Railsは自動的にsportsテーブルをフィルタリングします。別のクラスを使用するのが面倒な場合は、ベースSportクラスを使用し、typeフィールドで手動でフィルタリングすることもできます。

関連する問題