2011-06-18 6 views
0

Railsのモデル間で優れたスキーマ/アソシエーションを構築するのには苦労しています。 「プレイヤー」には複数の「ピック」があり、各「ピック」は3つの「ライダー」で構成されています。複数のforeign_keyをモデルで管理しています

スキーマ要約:

player.rb: 
class Player < ActiveRecord::Base 
    has_many :picks 
end 

pick.rb: 
class Pick < ActiveRecord::Base 
    has_many :riders, :foreign_key => "rider1_id" 
    has_many :riders, :foreign_key => "rider2_id" 
    has_many :riders, :foreign_key => "rider3_id" 
    belongs_to :player 
end 

rider.rb 
class Rider < ActiveRecord::Base 
    belongs_to :pick 
end 

は私が/私はコード内の団体のいくつかの基本的な理解が不足していますことを知っている感じ:

create_table players do |t| 
    t.string "name" 
    ... 
end 

create_table picks do |t| 
    t.integer "player_id" 
    t.integer "rider1_id" 
    t.integer "rider2_id" 
    t.integer "rider3_id" 
    ... 
end 

create_table riders do |t| 
    t.string "name" 
    ... 
end 

を私が構築したモデル間の関連のいくつかを持っています上記。特に、私は "myPick.rider1.name"のようなことを言いたいと思います。私はまた、 "myRider.picks"のような特定のライダーを含むピックを見ることができます(しかし、これも可能であるかどうかはわかりません)。そして基本的には、ピックモデルに3つの「ライダー」外来キーを持たせるのが正しいとは思いません。

ご意見ありがとうございます。 乾杯、 ジャック

答えて

1

あなたの協会は少し後ろにあります。外部キーbelongs_toの表はありません。したがって、has_manyコールの代わりに3 belongs_to :rider1, :class => 'Rider'コールが必要です。

# player.rb: 
class Player < ActiveRecord::Base 
    has_many :picks 
end 

# pick.rb: 
class Pick < ActiveRecord::Base 
    belongs_to :rider1, :class => 'Rider' 
    belongs_to :rider2, :class => 'Rider' 
    belongs_to :rider3, :class => 'Rider' 
    belongs_to :player 

    def riders 
    # returns an array so you can say pick.riders.each { |rider| ... } 
    # but it doesn't give you an ActiveRecord::AssociationProxy so you cannot 
    # do things like pick.riders.where(:condition => true) 
    [rider1, rider2, rider3] 
    end 
end 

# rider.rb 
class Rider < ActiveRecord::Base 
    has_one :pick 
end 

これはまだhas_many :ridersを行うと、それぞれのライダーの数の制限を強制するほどきれいになるだろうされていませんが(意図したとおりに内蔵された関係を使用して)選びます。

+0

はい、意味があります。ありがとうございました。 – Jacques

+0

ありがとうございます。基本的に、私は 'belongs_to'の構文が間違っていました。私はあなたが上に書いたものを少し修正しなければならなかった(恐らく私はまだRails 2 - 従来のプロジェクトを使用しているからかもしれないが)、私はそれに "belongs_to:rider1、:class_name => 'Rider'、:foreign_key =>:rider1_id '。私はまた、ライダーメソッドのアイデアが本当に好きで、1つの配列からすべてのライダーを操作できることも覚えています。どうもありがとうございました! – Jacques

関連する問題