【问题标题】:Rails Model user adding player to user pinboardRails 模型用户将播放器添加到用户插板
【发布时间】:2013-08-31 21:15:02
【问题描述】:

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

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

用户

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

插板

belongs_to :user
belongs_to :player

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

【问题讨论】:

    标签: ruby-on-rails class activerecord model


    【解决方案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 和玩家的对象来管理它们之间的关系。

    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 表的结果。

    【讨论】:

      【解决方案2】:

      试试:

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

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

      【讨论】:

      • 感谢 pdobb,技术上可行,但仍不如我预期。我的目标是这个。我想让一个用户创建一个新的 pinboard 并可能在 users_pinboard 上调用 add_player 方法,其中 add_player 是 pinboard 类中的一个实例方法,它将接受一个播放器对象参数并将 pinboard 表的 player_id 设置为 player.id 参数.因此,当我执行 user.pins 之类的操作时,我会得到一个添加到 current_users、指定 pinboard 的玩家列表。
      • 啊,明白了。我会尝试一个新的答案!
      猜你喜欢
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 2021-06-11
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2012-08-27
      相关资源
      最近更新 更多