2014-09-03 114 views
0

我需要連接2個玩家連接桌子。該連接表必須具有活動標誌,並且可能會有更多屬性前進。我希望能夠將2 PlayersPlayerLinkactive_playerpassive_player相關聯,所以我可以說player_link.active_player.name在Rails中設計關係的建議

我試過以下,但沒有得到我想要的行爲。也許我錯過了一些愚蠢的東西,或者錯誤地接近它。

module V1 
    class Player < ActiveRecord::Base 

    belongs_to :player_link 

    end  
end 

module V1 
    class PlayerLink < ActiveRecord::Base 

    has_one :active_player, class_name: "Player", foreign_key: :active_player_id 
    has_one :passive_player, class_name: "Player", foreign_key: :passive_player_id 
    end 
end 

schema.rb項:

create_table "player_links", force: true do |t| 
    t.integer "active_player_id" 
    t.integer "passive_player_id" 
    t.boolean "active" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

測試查詢炸燬:

V1::PlayerLink.where(active: true).each do |l| 
    l.active_player.update_attribute(:foo, bar) 
    l.passive_player.update_attribute(:foo, bar 
end 

與錯誤:

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: players.active_player_id: SELECT "players".* FROM "players" WHERE "players"."active_player_id" = ? 

獎勵:爲什麼Rails的查詢agains players

回答

1

這些被稱爲自我指涉協會 - 我第一次遇到麻煩時也遇到了麻煩。

嘗試修改您的控制器邏輯如下:

module V1 
    class Player < ActiveRecord::Base 

    has_many :player_links 

    end  
end 

module V1 
    class PlayerLink < ActiveRecord::Base 

    belongs_to :player, :foreign_key => "active_player_id" 
    belongs_to :passive_player, :class_name => "Player", :foreign_key => "passive_player_id" 

    end 
end 

欲瞭解更多信息,請參閱RailsCast #163