Rails3 и ActiveRecord с устаревшей базой данных: JOIN не возвращает другие столбцы таблицы - PullRequest
3 голосов
/ 22 января 2012

У меня есть устаревшая база данных, которая содержит две разные таблицы (tbl_players и tbl_player_ratings), которые ссылаются друг на друга в общем столбце (player_key).

Моя проблема: В Rails3, когда я пытаюсь получить PlayersRatings, присоединенные к Players, возвращаются только столбцы из PlayerRatings. Однако, если я выполняю тот же SQL-запрос в командной строке mysql, возвращаются столбцы из обеих таблиц.

Для простоты я приведу лишь несколько столбцов из каждой таблицы.

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)

Возвращает одиночный рейтинг игрока без представленных полей игрока.

SQL, полученный с помощью указанной выше команды rails:

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 голосов
/ 25 июня 2013

PlayerRating является только объектом PlayerRating;Вы не можете заставить его стать комбинацией PlayerRating-Player через соединение (: 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.

...