2013-08-31 88 views
0

我正在創建一個運動應用程序,該應用程序允許用戶根據需要創建接合板。用戶然後可以添加他們最喜歡的播放器到指定的插件板。因此,例如 用戶:傑克,創造了一個名爲「我最喜歡的防守球員」的新插腳板,然後他可以去找他最喜歡的防守球員,凱文加內特,並將石榴石添加到他的「我最喜歡的防守球員」插腳板中。Rails模型用戶將玩家添加到用戶接口板

我有一個用戶模型,一個Pinboards模型和一個Players模型。我嘗試了以下關聯,但沒有按照我的意願工作。

用戶

has_many :pinboards 
has_many :pins, through: pinboards, source: :player 

插件板

belongs_to :user 
belongs_to :player 

我知道一個球員不能有許多掲示板和插接板將舉行衆多玩家。我怎樣才能得到我想要的行爲;用戶創建插件板---用戶將玩家添加到插件板。

回答

1
User 

has_many :pin_boards 
has_many :pins, through: :pin_boards, source: :players 


PinBoard 

belongs_to :user 
has_many :pin_board_player_assignments 
has_many :players, through: :pin_board_player_assignments 


PinBoardPlayerAssignment 

belongs_to :pin_board 
belongs_to :player 


Player 

has_many :pin_board_player_assignments 
has_many :pin_boards, through: :pin_board_player_assignments 

所以,基本上,您需要添加另一個模型,稱爲PinBoardPlayerAssignment。從那裏,我會強烈建議使用此連接模型來創建和管理任務,例如:

PinBoardPlayerAssignment 

def self.create_between(a_pin_board, a_player) 
    assignment = a_pin_board.pin_board_player_assignments.build 
    assignment.player = a_player 
    assignment.save! 
end 

這樣,您就可以在Player使用上PinBoard實例方法來冷冷創造之間的分配PinBoard和播放器。基本上,讓最瞭解pin_board和player的對象成爲管理它們之間關係的對象。

PinBoard 

def add_player(a_player) 
    PinBoardPlayerAssignment.create_between(self, a_player) 
end 


Player 

def add_to_pin_board(a_pin_board) 
    PinBoardPlayerAssignment.create_between(a_pin_board, self) 
end 

和偉大的事情是,Rails的3.2+允許嵌套:通過關係讓你的原始請求 - 有@user.pins應該編譯通過pin_board然後通過pin_board_player_assignment臺自動去的結果。

0

嘗試:

has_many :pins, through: :pin_boards, source: :players 

的關鍵是使source是完全相同的作爲連接模型的關係。所以,由於你的加入模式(PinBoard)幾乎可以肯定地說has_many :players那麼你必須準確地匹配那個詞players。所以你只是想念's'。

+0

感謝pdobb,技術上可行,但仍然沒有像我期望的那樣。我的目標是這樣。我想有一個用戶創建一個新的插件板,並可能在users_pinboard上調用add_player方法,其中add_player是pinboard類中的一個實例方法將採用player對象參數並將pinboard表的player_id設置爲player.id參數。所以當我做一些像user.pins這樣的東西時,我會得到一個添加到current_users,指定插件板的玩家列表。 – AfDev

+0

啊,呃。我會嘗試一個新的答案! – pdobb

相關問題