2011-06-18 32 views
0

我正在努力在Rails中建立模型和模型之間的關聯,希望得到一些建議。 「玩家」有多個「選擇」,每個「選擇」都是由三位「騎手」組成的。在模型中管理多個foreign_key

總結模式:

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 

我有一些建立起來的模型之間的關聯:

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 

我覺得/知道,我很想念協會的一些基本理解的代碼以上。特別是,我希望能夠說出類似於「myPick.rider1.name」的內容。我也可以看看哪些選秀包括給定的騎手,比如「myRider.picks」(雖然我不確定這是甚麼可能)。從根本上說,我不確定在挑選模型中有三個「騎手」外鍵是否正確。

在此先感謝您的任何建議。 乾杯, 雅克

回答

1

你有你的協會有點倒退。該表與外鍵belongs_to表中沒有。所以你應該有3 belongs_to :rider1, :class => 'Rider'電話來代替那些has_many電話。

# 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 '。我也非常喜歡「騎手」的方法,並且能夠操縱一個陣列中的所有騎手。非常感謝! – Jacques

相關問題