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
このように、インスタンス メソッドを onPinBoard
またはon で使用Player
して、PinBoard と Player の間の割り当てを DRYly で作成できます。基本的に、pin_boards とプレイヤーについて最もよく知っているオブジェクトが、それらの間の関係を管理します。
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+ ではネストされた :through 関係が許可されているため、最初の要求@user.pins
では、pin_board を通過してから pin_board_player_assignment テーブルを自動的に通過した結果をコンパイルする必要があります。