2016-11-15 3 views
0

У меня есть две модели, связанные друг с другом следующим образом.Rails 5 - запрос ассоциации Activerecord

class Comment < ApplicationRecord 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :comments 
end 

После рекордного запроса

comments_list = Comment.where(:post_id => post_id, :is_delete => false).joins(:user).select('comments.*,users.*') 

Формирует следующий MySQL запрос в регистраторе

SELECT comments.*,users.* FROM `comments` INNER JOIN `users` ON `users`.`id` = `comments`.`user_id` WHERE `comments`.`post_id` = '81' AND `comments`.`is_delete` = 0. 

Это кажется генерируя очень ligitimate запрос, но comments_list объект содержит столбцы только из комментариев таблицы.

Благодаря

ответ

1

Это зависит от того, что вы хотите делать, если вы хотите, чтобы отобразить имя пользователя рядом с комментарием, ответ Mert Б. является штраф, все, что вам нужно сделать, это include(:user) и пользователей из список комментариев будет сгружаться вместе, когда вы делаете что-то вроде этого:

comments_list = Comment.where(:post_id => post_id, :is_delete => false).joins(:user).select('comments.*,users.*') 
comments_list.each do |comment| 
    puts "#{comment.text} by #{comment.user.name}" 
end 

Или, может быть, если вы хотите только те пользователи, которые имеют по крайней мере один комментарий, вы всегда можете выбирать пользователей из user_ids на столе комментариев:

User.where(id: Comment.select(:user_id)) 
+0

yes @Macelo Risoli - это сработало, спасибо. Таким образом, это означает, что я должен перевести результат, если я делаю этот запрос в контроллере, чтобы возвращать ответ обратно клиенту (браузеру), создавая еще один хеш путем итерации по петле – user3775217

+0

первый ответ - последний параст http://stackoverflow.com/questions/19175084/ActiveRecord-запросы через многодисковый присоединяется – user3775217

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