2017-09-07 10 views

答えて

0
@user_ids = Comment.where(status: true).pluck(:user_id) 

その後

User.where(id: @user_ids) 

は、そうでない場合は参加を使用し、あなたのすべての結果のためのユーザーとコメントからすべてのフィールドを提供します。

Comment.joins(:user).where(user_id: @user_ids) 
+0

質問モデルはどこにも言及していないため、正解ではありません。また、私は最後のコメントがステータスが偽のユーザーを取得したい。 –

0
users = [] 
User.all.each do |user| 
    users << user if user.comments && user.comments.last.status 
end 

users # list of all user whose last comment status = true 

usersオブジェクトは、その最後のコメントの状態が真であるすべてのユーザーを構成されています。

+0

私はレールのアクティブなレコードクエリのno loopを必要とします。 –

+1

@AnandShrivastavaはレールガイドに基づいています。これが正解です(動作している場合)。これはバッチ内の複数のオブジェクトを取得するためのクエリです また、アクティブなレコードクエリとループが不要な理由を説明してください http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches –

+0

ループはアクティブなレコードのクエリと比較すると時間がかかり、10000などのような多くのユーザーがロード時間が増えると、それが良い練習ではないと考えていることは明らかです。それは意味をなさない? –

0

あなたはこれが実際にサブクエリを必要とし、その考えは最初の最後のコメントをすべてのユーザーをフェッチしてステータスでフィルタリングされ

User.joins(:comments) 
    .where('comments.created_at = (SELECT MAX(comments.created_at) FROM comments WHERE comments.user_id = users.id)') 
    .where('comments.status = true') 
    .group('users.id') 

(これらの最後のコメントがステータス真を持っているユーザーを取得する)このクエリを試みることができます結合の助けを借りてユーザーのIDを知ることは本当です。

関連する問題