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