Rails 2: соединения и: включить набор результатов - PullRequest
1 голос
/ 12 июля 2010

При извлечении контента из базы данных с использованием activerecord я хотел бы получить пользовательский набор результатов с указанными столбцами в двух таблицах.

SELECT users.name, users.username, users.age, users.city_id, cities.name as city_name FROM users INNER JOIN cities ON users.city_id = cities.id

Что будет в AR как

Users.find(:all, 
   :joins => :cities, 
   :select => "users.name, users.username, users.age, users.city_id,
      cities.name as city_name")

Но это возвращает только результаты таблицы пользователя, а не результаты по городу. Я на 100% уверен, что внутренний оператор соединения выполняется (что обе таблицы объединяются).

Кажется, что возвращаемый объект имеет только столбцы, связанные с моделью. Таким образом, UserModel будет иметь только те столбцы, которые есть в таблице users, и не позволит извлекать столбцы таблицы city, даже если они указаны в select.

Должен ли я использовать: joins или: include? Есть идеи, что происходит?

Ответы [ 3 ]

3 голосов
/ 12 июля 2010

Если вы используете псевдоним объединенного имени столбца, то возвращаемый объект должен иметь атрибут с именем псевдонима, т.е.

u = User.first( :joins => :cities, 
      :select => "users.*, cities.name AS city_name")
u.city_name # returns the city_name.

В вашем случае :joins подходит, чем :include.

Я проверил это в своей настройке, и оно работает для меня (я на Rails 2.3.8)

1 голос
/ 12 июля 2010

В ваших возвращенных экземплярах, если имя столбца - city_name, вы должны использовать user.city_name. В качестве альтернативы, если вы используете: include, вы бы сказали ActiveRecord загрузить соответствующие модели городов, которые вы бы затем называли user.city.name.

Подведем итог:

users = User.find(:all, :joins => :cities, :select => "users.name, users.username, users.age, users.city_id, cities.name as city_name")
users.map(&:city_name)

users = User.find(:all, :include => :cities)
users.map(&:city).map(&:name)
0 голосов
/ 13 июля 2010

вы можете использовать определенное имя столбца в таблице пользователей вместо «users. *», Если вам не нужен весь столбец.Я думаю, что это хороший опыт программированияAS city_name ")

u.city_name # возвращает имя города.

...