Rails模型用户将播放器添加到用户键盘

时间:2013-08-31 21:15:03

标签: ruby-on-rails class activerecord model

我正在创建一个运动应用程序,允许用户根据自己的喜好创建指板。然后,用户可以将他们喜欢的播放器添加到指定的插板。所以举个例子 网友:杰克,创造了一个名为“我最喜欢的防御者”的新拼板,然后他可以找到他最喜欢的防守者,凯文加内特说,并在他的“我最喜欢的防守者”Pinboard上加/石榴石。

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

用户

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

插板

belongs_to :user
belongs_to :player

我知道一个玩家不能拥有很多插板,插板可以容纳很多玩家。我怎样才能得到我想要的行为;用户创建pinboard ---用户将玩家添加到插板。

2 个答案:

答案 0 :(得分: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

这样,您可以在PinBoard上的Player 上使用实例方法,以便在PinBoard和播放器之间创建分配。基本上,让对pin_boards和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表自动生成的结果。

答案 1 :(得分:0)

尝试:

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

关键是要使source与连接模型中的关系完全相同。因此,由于您的连接模型(PinBoard)几乎肯定会说has_many :players,因此您必须完全匹配该字players。所以你只是错过了'。