3

共通の列 (player_key) で相互にリンクする 2 つの異なるテーブル (tbl_players と tbl_player_ratings) を含むレガシー データベースがあります。

私の問題: Rails3 では、PlayersRatings を Players に結合して取得しようとすると、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 が同じことをしないのはなぜですか (両方のテーブルのすべての列を返す)?

4

1 に答える 1

0

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

SQLクエリとActiveRecordクエリの違いの完全な説明については、リンクされた重複した質問を見てください。

于 2013-06-25T18:09:15.837 に答える