0

ユーザーが好きなだけピンボードを作成できるスポーツ アプリケーションを作成しています。ユーザーは、お気に入りのプレーヤーを特定のピンボードに追加できます。たとえば、ユーザー: ジャックは、「お気に入りのディフェンダー」という名前の新しいピンボードを作成します。次に、お気に入りのディフェンダー (Kevin Garnet など) を見つけて、ガーネットを「お気に入りのディフェンダー」ピンボードに追加/ピン留めすることができます。

ユーザー モデル、ピンボード モデル、プレーヤー モデルがあります。次の関連付けを試しましたが、思うように動作しませんでした。

ユーザー

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

ピンボード

belongs_to :user
belongs_to :player

プレーヤーが多くのピンボードを持つことはできず、ピンボードには多くのプレーヤーが保持されることはわかっています。必要な動作を取得するにはどうすればよいですか。ユーザーがピンボードを作成 --- ユーザーがプレーヤーをピンボードに追加します。

4

2 に答える 2

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

このように、インスタンス メソッドを 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 テーブルを自動的に通過した結果をコンパイルする必要があります。

于 2013-08-31T22:27:24.430 に答える
0

試す:

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

重要なのはsource、結合モデルの関係とまったく同じにすることです。したがって、結合モデル (PinBoard) はほぼ確実has_many :playersにその単語と一致する必要があると言っているからですplayers。つまり、「s」が欠落していました。

于 2013-08-31T21:34:38.360 に答える