Rails:如何绘制此 has_many、has_many 关联?
Rails: How do I map out this has_many, has_many association?
我目前正在为一个学生项目开发游戏。我在设计协会的圈子里转来转去。非常感谢来自社区的任何指导。
有 3 个 models/classes:游戏、角色和名言。
游戏:
- has_many个人物(两个历史人物配一串名言,你要选谁说的名言)
- has_many 语录(通过游戏)
字符:
- has_many 游戏(记录角色出现的游戏)
- has_many 行情
引用:
- belongs_to 字符
class Game < ActiveRecord::Base
has_many :characters
# Each game will have exactly 2 characters
# @game.characters will return the two characters
has_many :quotes, through: :characters
end
class Characters < ActiveRecord::Base
has_many :games
# @character.games will return all games the character appeared in
has_many :quotes
end
class Quote < ActiveRecord::Base
belongs_to :character
end
这些是我创建的迁移:
class CreateGames < ActiveRecord::Migration[5.1]
def change
create_table :games do |t|
t.text :game_state
end
end
end
class CreateCharacters < ActiveRecord::Migration[5.1]
def change
create_table :characters do |t|
t.string :name
t.string :title
end
end
end
class CreateQuotes < ActiveRecord::Migration[5.1]
def change
create_table :quotes do |t|
t.string :content
t.belongs_to :character, index: true
end
end
end
目标:
- 用两个角色实例化一个新游戏:
@game =
Game.new(@character1, @character2)
@game.characters
应该 return
两个字符。
@character1.games
应该return所有游戏
该角色出现在.
@game.quotes
应该 return 所有
引用两个角色。
我的第一直觉是我需要加入 table 来建立 has_many has_many 关系并跟踪游戏。例如:.
class GamesPlayed < ApplicationRecord
belongs_to :character1
belongs_to :character2
belongs_to :game
end
如果您能给我任何指导或建议,在此先感谢您。
要为多对多关系建模,您可以使用依赖于连接 table(无模型)的 has_and_belongs_to_many
,或表示两者之间关系的模型楷模。
我想知道你是否真的没有多对多关系。考虑一下:
class Game
belongs_to :player_one, class_name: 'Player'
belongs_to :player_two, class_name: 'Player'
scope :for_player, ->(player) { where(player_one: player).or(where(player_two: player)) }
def players
Player.where(id: [player_one_id, player_two_id])
end
end
class Player
def games
Game.for_player(self)
end
end
# In use:
@game = Game.find(1)
@game.players
@player = Player.find(1)
@player.games
@player.games.where(created_at: 1.week.ago..Date.today)
请注意,game.players
和 player.games
return 都可以在其他范围内使用 ActiveRecord_Relation
,只是没有 has_many
在 Player
模型上。
您编写关联的方式并没有真正充实游戏与角色模型之间的多对多关联。基本上你需要一个加入table。
最简单的形式如下所示:
class Game < ActiveRecord::Base
has_many :game_character_joins
has_many :characters, through: :game_character_joins
end
class Characters < ActiveRecord::Base
has_many :game_character_joins
has_many :games, through: :game_character_joins
end
class GameCharacterJoin < ActiveRecord::Base
belongs_to :game
belongs_to :character
end
加入 table 的迁移将是:
class CreateGameCharacterJoin < ActiveRecord::Migration[5.1]
def change
create_table :game_character_joins do |t|
t.integer :game_id
t.integer :character_id
end
end
end
这确实是我认为您要问的问题中比较简单的部分。
然后,Quote 和 Game 之间的关联对我来说有点奇怪。这是因为您需要获取单个游戏的所有行情吗?有很多方法可以对此进行建模——在 Quote 和 Game 之间建立关联的想法是为了方便吗?在我看来,引用是
- 同时需要角色和游戏,
- 被角色拥有
- 关于游戏
你如何处理这个真的成为一个偏好问题。根据关联的重要性,您可以在角色和引述之间建立多对多关系,在游戏和引述之间建立多对多关系,或者您可以仅依靠引述中的其他数据 table 来指定它与哪个游戏有关。
我目前正在为一个学生项目开发游戏。我在设计协会的圈子里转来转去。非常感谢来自社区的任何指导。
有 3 个 models/classes:游戏、角色和名言。
游戏:
- has_many个人物(两个历史人物配一串名言,你要选谁说的名言)
- has_many 语录(通过游戏)
字符:
- has_many 游戏(记录角色出现的游戏)
- has_many 行情
引用:
- belongs_to 字符
class Game < ActiveRecord::Base
has_many :characters
# Each game will have exactly 2 characters
# @game.characters will return the two characters
has_many :quotes, through: :characters
end
class Characters < ActiveRecord::Base
has_many :games
# @character.games will return all games the character appeared in
has_many :quotes
end
class Quote < ActiveRecord::Base
belongs_to :character
end
这些是我创建的迁移:
class CreateGames < ActiveRecord::Migration[5.1]
def change
create_table :games do |t|
t.text :game_state
end
end
end
class CreateCharacters < ActiveRecord::Migration[5.1]
def change
create_table :characters do |t|
t.string :name
t.string :title
end
end
end
class CreateQuotes < ActiveRecord::Migration[5.1]
def change
create_table :quotes do |t|
t.string :content
t.belongs_to :character, index: true
end
end
end
目标:
- 用两个角色实例化一个新游戏:
@game = Game.new(@character1, @character2)
@game.characters
应该 return 两个字符。
@character1.games
应该return所有游戏 该角色出现在.
@game.quotes
应该 return 所有 引用两个角色。
我的第一直觉是我需要加入 table 来建立 has_many has_many 关系并跟踪游戏。例如:.
class GamesPlayed < ApplicationRecord
belongs_to :character1
belongs_to :character2
belongs_to :game
end
如果您能给我任何指导或建议,在此先感谢您。
要为多对多关系建模,您可以使用依赖于连接 table(无模型)的 has_and_belongs_to_many
,或表示两者之间关系的模型楷模。
我想知道你是否真的没有多对多关系。考虑一下:
class Game
belongs_to :player_one, class_name: 'Player'
belongs_to :player_two, class_name: 'Player'
scope :for_player, ->(player) { where(player_one: player).or(where(player_two: player)) }
def players
Player.where(id: [player_one_id, player_two_id])
end
end
class Player
def games
Game.for_player(self)
end
end
# In use:
@game = Game.find(1)
@game.players
@player = Player.find(1)
@player.games
@player.games.where(created_at: 1.week.ago..Date.today)
请注意,game.players
和 player.games
return 都可以在其他范围内使用 ActiveRecord_Relation
,只是没有 has_many
在 Player
模型上。
您编写关联的方式并没有真正充实游戏与角色模型之间的多对多关联。基本上你需要一个加入table。
最简单的形式如下所示:
class Game < ActiveRecord::Base
has_many :game_character_joins
has_many :characters, through: :game_character_joins
end
class Characters < ActiveRecord::Base
has_many :game_character_joins
has_many :games, through: :game_character_joins
end
class GameCharacterJoin < ActiveRecord::Base
belongs_to :game
belongs_to :character
end
加入 table 的迁移将是:
class CreateGameCharacterJoin < ActiveRecord::Migration[5.1]
def change
create_table :game_character_joins do |t|
t.integer :game_id
t.integer :character_id
end
end
end
这确实是我认为您要问的问题中比较简单的部分。
然后,Quote 和 Game 之间的关联对我来说有点奇怪。这是因为您需要获取单个游戏的所有行情吗?有很多方法可以对此进行建模——在 Quote 和 Game 之间建立关联的想法是为了方便吗?在我看来,引用是
- 同时需要角色和游戏,
- 被角色拥有
- 关于游戏
你如何处理这个真的成为一个偏好问题。根据关联的重要性,您可以在角色和引述之间建立多对多关系,在游戏和引述之间建立多对多关系,或者您可以仅依靠引述中的其他数据 table 来指定它与哪个游戏有关。