2015-07-21 3 views
2

МоделиRails ActiveRecord запрос для соединения нескольких таблиц

class AdminUser < ActiveRecord::Base 
    has_many :users 
end 
class User < ActiveRecord::Base 
    has_many :posts 
end 
class Post < ActiveRecord::Base 
    has_many :comments 
end 

Я хочу, чтобы получить список всех комментариев под каждую должность, созданную каждый пользователь в соответствии с настоящим AdminUser.

Чтобы получить все комментарии по каждому сообщению, сделанным одним пользователем, легко. Я бы использовал что-то вроде

comments=Comment.joins(:post).where("posts.user_id= ?",userid.to_s) 

Но здесь мне нужно подняться еще на один уровень. т.е. получать комментарии от каждой записи, сделанной каждым пользователем до 1 admin_user. Я никогда раньше не использовал более одного соединения, поэтому я немного смущен.

Если бы я мог использовать ActiveRecord ассоциации внутри строки это может выглядеть

 comments=Comment.joins(:post).joins(:user).where("posts.user.admin_user.id=?",adminuser_id) 

Но я не могу использовать posts.user.admin_user

ответ

0

Это должно быть как

Comment.joins(post: :user) 
+0

Я предположил, что комментарий принадлежит к сообщению, и сообщение принадлежит пользователю. Вот почему. – Santanu

+0

Прочтите вопрос. –

+0

Да, это было то, что я искал. : user) .where ("user.admin_user_id = ?, admin_id) –

2

как насчет первых выборки идентификаторов пользователей, которые принадлежит пользователю admin, а затем используется для выбора комментариев по вашему запросу.

user_ids = admin_user.users.pluck(:id) 
comments=Comment.joins(:post).where("posts.user_id IN (?)", user_ids) 

Я предположил, что ваш вопрос, который вы вставили в вопрос, будет работать.

+0

Это работает и спасибо за ответ ... Но я искал, чтобы узнать, как это сделать в 1 заявление, а также обучение нескольких объединений в процессе. Пожалуйста, дайте мне знать, если есть способ сделать это в 1 строке. Еще раз спасибо ... –

+0

может быть ошибочным, но я думаю, что здесь потребуется внутренний запрос, в котором мы будем извлекать user_ids: post.user_id IN (внутренний запрос, в котором мы получаем пользователей, связанных с администратором). bcoz нам нужно сопоставить posts.user_id со всеми user_ids против этого администратора. im не так хорошо в сыром sql. :(Я бы помог вам сделать это одним из следующих способов: 'comments = Comment.joins (: post) .where (" posts.user_id IN (?) ", admin_user.users. pluck (: id)) ' – Athar

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