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