2012-04-25 3 views
13

Ниже приведены отношения между комментариями и пользователем. У каждого комментария есть один пользователь, поэтому я создаю соединение в коде ниже.Rails 3 Соединения - Выберите только определенные столбцы

Мне было интересно, как построить этот код, чтобы включать в него только определенные столбцы. Мне не нужна вся информация пользователя. Просто первое имя. Какие-либо предложения.

Текущий код:

@comments = Comment.where(:study_id => @study.id).joins(:user) 
+0

В вашей модели комментариев нет: ассоциации пользователей? Вы пытаетесь получить информацию о загрузке пользователя? Что вы пытаетесь выполнить с помощью соединения, которое ActiveRecord еще не дает вам? – PinnyM

+1

Да. Я пытаюсь загрузить информацию. В настоящее время для каждого комментария пользователю предоставляется пользователь. – Kyle

ответ

21

Вы могли бы использовать что-то вроде этого:

@comments = Comment.joins(:user) 
        .select("comments.*, users.first_name") 
        .where(study_id: @study.id) 
+1

Здесь объединения будут вести себя как внутреннее соединение. Использование включает в себя: User.includes (: comments) .select (...) –

3

Расширения ответа Альдо, чтобы показать способ извлечения полученного иностранное значения столбца.

@comments = \ 
    Comment\ 
    .joins(:user) 
    .select("comments.*, users.first_name as users_first_name") 
    .where(study_id: @study.id) 

# Now it's stored on each comment as an attribute, e.g.: 
puts @comments.first.read_attribute(:users_first_name) 
puts @comments.first.attributes['users_first_name'] 

# Note that inspecting the comment won't show the foreign data 
puts @comments.first.inspect # you won't see user's first name output 

Вы также можете объявить users_first_name как Attrib на комментарий с attr_accessible. Я не думаю, что есть волшебный способ автоматически установить его, но вы можете легко сделать это сами в цикле после выбора.

+1

Beautiful-this did it – Yarin

+0

Это работает. Но будьте осторожны - когда вы проверяете вывод (экземпляр «@ comments.first.inspect» или «@ comments.inspect»), вы не увидите объединенные данные и можете ввести в заблуждение, думая, что он не может его вытащить. Но когда вы указываете имя «как», указанное, как в этом примере, с «puts» - оно появляется. – JosephK

+0

Хорошо, добавьте его в пример – mahemoff

Смежные вопросы