0

我正在创建一个体育应用程序,它允许用户创建任意数量的插板。然后,用户可以将他们最喜欢的球员添加到指定的插板。例如,用户:Jack 创建了一个名为“我最喜欢的防守者”的新 pinboard,然后他可以去寻找他最喜欢的防守者,比如 Kevin Garnet,并将 garnet 添加/固定到他的“我最喜欢的防守者” Pinboard。

我有一个用户模型、一个插板模型和一个玩家模型。我尝试了以下关联,但没有按我的意愿工作。

用户

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来 DRYly 创建 PinBoard 和 Player 之间的分配。基本上,让最了解 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 回答