Ruby - 模型中表示的迁移参考

Ruby - migration reference represented in model

好的,我有的是:

Two entities: games and apps. They have a relation from apps to games:

  • On the migration it is as follows: add_reference :apps, :games, type: :uuid, foreign_key: true
  • On app model it is like this: belongs_to :game
  • On game model it is like this: has_many :apps

现在,这允许我拥有一个 app 并将其分配给一个 game(在数据库中,它在 app 上显示一个新列 game_id table).

我现在要做的是添加一个名为 requested_game 的游戏的列。

为此,我添加了以下迁移:add_reference :apps, :requested_game, type: :uuid, foreign_key: { to_table: :games },但现在我不知道如何在模型中显示该关系。

有什么想法吗?我是否必须创建一个 requested_game 模型并将其引用到 game 模型?我现在有点迷路了...

我认为 this Whosebug Answer 将多个外键放在一个 table 上可能会满足您的需求。

稍微推断一下,听起来您可能最终希望 App 模型的实例附加多个方法?例如:

new_app = App.first
new_app.game
=> old_game
new_app.requested_game
=> newly_requested_game

如果那是你想要的,那么,正如上面 link 中所解释的,你会希望 apps table 有两个外键,都指向games table。当然,您必须为 table 列和 game table 中相应的 belongs_to 方法提供正确的选项以了解哪个是哪个。

我认为您不需要创建 RequestedGame 模型,除非您想要使用其自己的方法或诸如此类的东西创建该模型的实例。因此,如果您想 运行 类似 requested_game.app 的东西,该模型可能会派上用场。

如果我对您的问题的理解正确,您希望拥有一个具有以下功能的应用:

  1. 通过 game_id
  2. 链接到应用程序的游戏
  3. requested_game_id
  4. 链接到应用程序的请求游戏

本质上就是从tableapps到tablegames的2个链接,有2个不同的外键。

所以在模型App中,可以这样写:

class App < ActiveRecord::Base
  belongs_to :game, class_name: 'Game', foreign_key: 'game_id'
  belongs_to :requested_game, class_name: 'Game', foreign_key: 'requested_game_id'
end

# Or with newer versions of Rails

class App < ApplicationRecord
  belongs_to :game, class_name: 'Game', foreign_key: 'game_id'
  belongs_to :requested_game, class_name: 'Game', foreign_key: 'requested_game_id'
end

在模型游戏中,可以这样写:

class Game < ActiveRecord::Base
  has_many :apps, class_name: 'App', foreign_key: 'game_id'
  has_many :requesting_apps, class_name: 'App', foreign_key: 'requested_game_id'
end

# Or with newer versions of Rails

class Game < ApplicationRecord
  has_many :apps, class_name: 'App', foreign_key: 'game_id'
  has_many :requesting_apps, class_name: 'App', foreign_key: 'requested_game_id'
end