Ответ 1
Вы можете использовать что-то вроде этого:
@comments = Comment.joins(:user)
.select("comments.*, users.first_name")
.where(study_id: @study.id)
Ниже приведена связь между комментариями и пользователем. У каждого комментария есть один пользователь, поэтому я создаю соединение в коде ниже.
Мне было интересно, как создать этот код, чтобы включать только определенные столбцы в join. Мне не нужна вся информация пользователя. Просто первое имя. Любые предложения.
Текущий код:
@comments = Comment.where(:study_id => @study.id).joins(:user)
Вы можете использовать что-то вроде этого:
@comments = Comment.joins(:user)
.select("comments.*, users.first_name")
.where(study_id: @study.id)
Расширение ответа Aldo, чтобы показать способ получить полученное значение внешнего столбца.
@comments = \
Comment\
.joins(:user)
.select("comments.*, users.first_name as users_first_name")
.where(study_id: @study.id)
# Now it 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 first name output
Вы также можете объявить users_first_name
как атрибут комментария с attr_accessible. Я не думаю, что есть волшебный способ автоматически установить его, но вы можете легко сделать это самостоятельно в цикле после выбора.