我是Ruby on Rails的新手,我正在研究一个简单的国际象棋游戏应用程序,并且通过我的用户(玩家),游戏和棋子模型之间的关联,我有一些理解如何使用多个关联和has_many的问题。我打算创建的模型是:
class User < ActiveRecord::Base
has_many :white_games, class: :Game, foreign_key: :'white_user_id'
has_many :black_games, class: :Game, foreign_key: :'black_user_id'
has_many :pieces, through: :games, source: :games
end
class Game < ActiveRecord::Base
belongs_to :white_user, class: :User, foreign_key: :'white_user_id'
belongs_to :black_user, class: :User, foreign_key: :'black_user_id'
has_many :pieces, foreign_key: :game_id
end
class Piece < ActiveRecord::Base
belongs_to :game
end
这应该使用自定义外键,并将每个关联链接为从Game模型到游戏的每个用户(玩家)的单个belongs_to调用。
然后我将其扩展到User模型。在游戏中,每个单独的用户将具有Game类的多个实例,因为用户可以一次成为多个游戏的一部分。
所以white_games代表玩家所在的所有游戏,他/她是白人玩家的地方 - &gt;映射到游戏中的belongs_to white_user。而对于与black_user相同的用户参与的所有游戏,black_games也是如此。
问题:
1)这些关联是否正确设置?
2)对于棋子模型,基本上我想要一次返回用户对特定游戏的所有棋子。
使用带有has_many的“外键”是否可行,然后在用户模型中使用has_many:pieces指定“source”,通过::: game?
所以,当我打电话给@ user.pieces(game:game.id)时,它会做到这一点吗?
答案 0 :(得分:0)
has_many :pieces, foreign_key: :game_id
此处的外键不是必需的,因为默认情况下,Rails将查找为该类命名的外键。该类为Game
,因此默认情况下Rails会在另一个模型上查找game_id
。最佳做法是不要包含Rails默认包含的内容。 (黑/白游戏中的外键是必要的,因为它们的命名方式不同于<class>_id
)
has_many :pieces, through: :games, source: :games
这可能无效,因为您没有设置名为games
的关联 - 您改为white_games
和black_games
,因此through
位将去寻找这种关联并告诉你它无法找到。
对于你说你需要的东西 - 我认为你根本不需要这种关联。你想要用户特定游戏的作品吗?那么你只需要获取游戏,然后从游戏中抓取碎片
game = current_user.white_games.find(params[:id])
# will return all pieces for this game, both white and black
pieces = game.pieces
如果您只想要黑色用户的作品......那么您需要添加一些区分白色和黑色的内容,例如colour
到Piece
类的列。
然后你就能做到这样的事情:
class Piece
belongs_to :game
scope :black -> { where(colour: "black") }
scope :white -> { where(colour: "white") }
end
game = current_user.white_games.find(params[:id])
# will return all pieces for this game, both white and black
pieces = game.pieces
# just the black pieces
black_pieces = game.pieces.black