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 的东西,该模型可能会派上用场。
如果我对您的问题的理解正确,您希望拥有一个具有以下功能的应用:
- 通过
game_id
链接到应用程序的游戏
requested_game_id
链接到应用程序的请求游戏
本质上就是从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
好的,我有的是:
Two entities:
games
andapps
. They have a relation fromapps
togames
:
- 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 的东西,该模型可能会派上用场。
如果我对您的问题的理解正确,您希望拥有一个具有以下功能的应用:
- 通过
game_id
链接到应用程序的游戏
requested_game_id
链接到应用程序的请求游戏
本质上就是从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