【问题标题】:Rails3 and ActiveRecord with legacy database: JOIN not returning other table columnsRails3 和 ActiveRecord 与旧数据库:JOIN 不返回其他表列
【发布时间】:2012-01-22 08:32:16
【问题描述】:

我有一个旧数据库,其中包含两个不同的表(tbl_players 和 tbl_player_ratings),它们在公共列(player_key)上相互链接。

我的问题:在 Rails3 中,当我尝试检索加入 Players 的 PlayersRatings 时,只返回来自 PlayerRatings 的列。但是,如果我在 mysql 命令行中执行相同的 SQL 查询,则会返回两个表中的列。

为简单起见,我在这里只提供每个表中的几列。

tbl_players

player_key, last_name

tbl_player_ratings

player_key, rating

代表这些表的我的 Rails 类如下所示:

class PlayerRating < ActiveRecord::Base
  establish_connection :legacy
  set_table_name 'tbl_player_ratings'
  set_primary_key "player_key"
  belongs_to :player,
             :foreign_key => 'player_key'
end

class Player < ActiveRecord::Base
  establish_connection :legacy
  set_table_name 'tbl_players'
  set_primary_key "player_key"
  has_many :player_ratings,
           :foreign_key => 'player_key'
end

我在 rails 控制台中运行的查询:

PlayerRating.joins(:player).select("*").limit(1)

这将返回一个没有任何 Player 字段的唯一 PlayerRating。

上述rails命令产生的SQL:

SELECT * FROM `tbl_player_ratings` INNER JOIN `tbl_players` ON `tbl_players`.`player_key` = `tbl_player_ratings`.`player_key` LIMIT 1

当我在 mysql 命令行中执行该命令时,两个表中的所有列都会返回。

为什么 Rails 和 ActiveRecord 不一样(返回两个表中的所有列)?

【问题讨论】:

标签: ruby-on-rails-3 activerecord legacy-database


【解决方案1】:

一个 PlayerRating 只是一个 PlayerRating 对象;您不能通过查询中的 joins(:player) 将其强制为 PlayerRating-Player 组合。

查询后,您将可以通过player_rating.player 访问播放器。

array_of_player_ratings = PlayerRating.joins(:player).limit(any_number) 
single_player_rating = PlayerRating.joins(:player).first 
player = single_player_rating.player

请查看duplicate question linked 以更全面地描述 SQL 查询和 ActiveRecord 查询之间的区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2020-09-26
    • 2021-12-01
    相关资源
    最近更新 更多