带有旧数据库的Rails和ActiveRecord:JOIN不返回其他表列

时间:2012-01-22 08:32:16

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

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

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

为简单起见,我在这里仅提供每个表中的一些列。

tbl_players

player_key, last_name

tbl_player_ratings

player_key, rating

表示这些表的My 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)

这将返回唯一的PlayerRating,而不代表任何Player字段。

上面的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不会这样做(返回两个表中的所有列)?

1 个答案:

答案 0 :(得分:0)

PlayerRating只是一个PlayerRating对象;你不能通过查询上的连接(:播放器)强制它成为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查询之间差异的更全面描述。