2013-06-01 98 views
16

我在我的Rails應用程序中有2個模型之間的關係。我已經遠離了如何實現關係的標準,因爲我使用另一個字段作爲主鍵,命名約定不同。這樣做導致了這種關係看似不成立。我想了解爲什麼。Rails belongs_to has_many與自定義外鍵

這是我的模型的下調版本:

class Player < ActiveRecord::Base 
    set_primary_key "alias" 
    attr_accessible :alias, :avatar 
    has_many :player_sessions, :foreign_key => "player_alias", :class_name => "PlayerSession" 
end 

class PlayerSession < ActiveRecord::Base 
    attr_accessible :player_alias, :total_score 
    belongs_to :player, :foreign_key => "player_alias", :class_name => "Player" 
end 

Player模型領域alias這是在我的應用程序的用戶名。我希望用戶名充當主鍵,因爲它是唯一的,並且遷移數據和維護關係會更容易。

本來我只有PlayerSession模型的數據已經填入,但隨着我的應用程序的增長,我添加了Player模型,並且簡單地插入了一個具有相同alias的行。

Playershow觀點我有以下代碼:

Player Sessions: 
<% @player.player_sessions do |player_session| %> 
<ul> 
    <li><h4>Highest Score:</h4> <%= player_session.total_score %> </li> 
</ul> 

當我嘗試訪問的頁面簡單不顯示信息。

我可以添加的其他信息是我沒有在數據庫本身中添加任何關係。

我還是個新手,還在玩弄它。任何關於編碼標準(回答問題之外)的意見都是值得歡迎的。

class Player < ActiveRecord::Base 
    set_primary_key "alias" 
    attr_accessible :alias, :avatar 
    has_many :player_sessions, :primary_key => "alias", :foreign_key => "player_alias", :class_name => "PlayerSession" 
end 

class PlayerSession < ActiveRecord::Base 
    attr_accessible :player_alias, :total_score 
    belongs_to :player, :primary_key => "alias", :foreign_key => "player_alias", :class_name => "Player" 
end 

也測試出的數據是否有效我手動採集的PlayerSession列表:


更新我已經通過增加模型中的primary_key選項實現巴布爾Usenakunov的建議

控制器中執行的代碼:

@player_sessions = PlayerSession.where("player_alias = ?", params[:id]) 
鑑於實施

代碼(輸出數據):

<% @player_sessions.each do |player_session| %> 
<ul> 
    <li><h4>Highest Score:</h4> <%= player_session.total_score %> </li> 
</ul> 
<% end %> 
+1

我不確定,但也許你應該在選項中傳遞主鍵。例如。 'has_many:player_sessions,:primary_key =>'alias',:foreign_key =>'player_alias':class_name =>'PlayerSession''和'belongs_to:player,:primary_key =>'alias',:foreign_key =>「player_alias」, :class_name =>「Player」 –

+0

嘗試過這種方式,但仍然不起作用 – Drahcir

+0

@Drahcir,我傾向於認爲Babur Usenakunov的建議應該起作用。在嘗試了他們的建議後,@ player.player_sessions'會返回什麼? – Sun

回答

1

如果您PlayerSession表中有一個名爲alias那麼你的外鍵也應該是alias,不player_alias列。作爲一個建議的標誌,我會小心使用別名作爲foreign_key:如果你的玩家可以/決定改變他的別名,那麼你的數據庫中的所有PlayerSession記錄都將失效並需要更新。使用不可變參數(如player_id)比使用現有別名列IMHO更可取。

+0

別名是玩家的用戶名。所以它不能改變。這就像決定更改您的電子郵件地址並保留所有電子郵件一樣 – Drahcir

12

我已經解決了這個問題,它是在環加each的問題我在視圖中實現:

<% @player.player_sessions.each do |player_session| %> 
<ul> 
    <li><h4>Highest Score:</h4> <%= player_session.total_score %> </li> 
</ul>  
<% end %> 

了一下週圍打後,我意識到,我並不需要添加primary_key選項,並且僅在Player型號中留下外鍵選項。

class Player < ActiveRecord::Base 
    set_primary_key "alias" 
    attr_accessible :alias, :avatar 
    has_many :player_sessions, :foreign_key => "player_alias", :class_name => "PlayerSession" 
end 

class PlayerSession < ActiveRecord::Base 
    attr_accessible :player_alias, :total_score 
    belongs_to :player, :class_name => "Player" 
end 
+0

您能幫我解決這個問題嗎? http://stackoverflow.com/questions/25047920/rails-belongs-to-with-custom-column-name – mariowise

相關問題