2013-08-31 85 views
0

我正在创建一个运动应用程序,该应用程序允许用户根据需要创建接合板。用户然后可以添加他们最喜欢的播放器到指定的插件板。因此,例如 用户:杰克,创造了一个名为“我最喜欢的防守球员”的新插脚板,然后他可以去找他最喜欢的防守球员,凯文加内特,并将石榴石添加到他的“我最喜欢的防守球员”插脚板中。Rails模型用户将玩家添加到用户接口板

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

用户

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

插件板

belongs_to :user 
belongs_to :player 

我知道一个球员不能有许多掲示板和插接板将举行众多玩家。我怎样才能得到我想要的行为;用户创建插件板---用户将玩家添加到插件板。

回答

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 

这样,您就可以在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台自动去的结果。

0

尝试:

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

的关键是使source是完全相同的作为连接模型的关系。所以,由于你的加入模式(PinBoard)几乎可以肯定地说has_many :players那么你必须准确地匹配那个词players。所以你只是想念's'。

+0

感谢pdobb,技术上可行,但仍然没有像我期望的那样。我的目标是这样。我想有一个用户创建一个新的插件板,并可能在users_pinboard上调用add_player方法,其中add_player是pinboard类中的一个实例方法将采用player对象参数并将pinboard表的player_id设置为player.id参数。所以当我做一些像user.pins这样的东西时,我会得到一个添加到current_users,指定插件板的玩家列表。 – AfDev

+0

啊,呃。我会尝试一个新的答案! – pdobb

相关问题