Rails ActiveRecord使用不同的密钥通过has_many关联访问记录

时间:2017-06-14 21:25:51

标签: ruby-on-rails ruby activerecord

方案

我正在Rails中为我之前编写的旧应用程序构建一个管理面板,因此数据库不适用于 ActiveRecord

设计

enter image description here

正如您所看到的,GameRefferal表使用的外键不是id的{​​{1}},而是User上的一列1}},称为User

Rails模型:

  • steam_id上课
    • User

问题

当我尝试以下命令时:

has_many :games, :foreign_key => 'player'

ActiveRecord正在生成以下查询:

User.find(1).games

正如您在第二个查询中看到的那样,它会尝试查找User Load (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 Game Load (1012.0ms) SELECT `games`.* FROM `games` WHERE `games`.`player` = '1' 列等于 player 的游戏。

显然这不是我想要的。我希望 1 等于 game.player

的游戏

我该如何解决?最重要的是,我如何修复user.steam_id关联?

考虑

主网站已经上线并且有活跃用户。我不能开始重新设计整个数据库和代码库本身。

3 个答案:

答案 0 :(得分:4)

尝试在关联中指定primary_key

User型号:

has_many :games, primary_key: 'steam_id', foreign_key: 'player'

Game型号:

belongs_to :user, primary_key: 'steam_id', foreign_key: 'player'

现在,您应该可以使用User.find(1).gamessteam_id将使用id代替PatientProfile .joins(:recommendations, :reviews) .group(:id) .pluck(:name, 'count(distinct recommendations.id)', 'count(distinct reviews.id)') 来查询用户的游戏。

答案 1 :(得分:0)

您可以运行2个单独的查询:

user = User.find(1)
games = Games.where(player: user.stream_id)

答案 2 :(得分:0)

用户类:

has_many :games, :foreign_key => 'player'

游戏课程:

belongs_to :player, class_name: 'User'

这可能有助于您尝试。