ユーザーには多くのコメントとコメントがあります。コメントテーブルには、ブール型のステータスカラムがあります。Railsには多くのアクティブレコードクエリがあります
最後のコメントのステータスがtrueのユーザーを取得したいと考えています。
これはActiveRecordクエリでどのように行うことができますか?
ユーザーには多くのコメントとコメントがあります。コメントテーブルには、ブール型のステータスカラムがあります。Railsには多くのアクティブレコードクエリがあります
最後のコメントのステータスがtrueのユーザーを取得したいと考えています。
これはActiveRecordクエリでどのように行うことができますか?
@user_ids = Comment.where(status: true).pluck(:user_id)
その後
User.where(id: @user_ids)
は、そうでない場合は参加を使用し、あなたのすべての結果のためのユーザーとコメントからすべてのフィールドを提供します。
Comment.joins(:user).where(user_id: @user_ids)
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
オブジェクトは、その最後のコメントの状態が真であるすべてのユーザーを構成されています。
私はレールのアクティブなレコードクエリのno loopを必要とします。 –
@AnandShrivastavaはレールガイドに基づいています。これが正解です(動作している場合)。これはバッチ内の複数のオブジェクトを取得するためのクエリです また、アクティブなレコードクエリとループが不要な理由を説明してください http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches –
ループはアクティブなレコードのクエリと比較すると時間がかかり、10000などのような多くのユーザーがロード時間が増えると、それが良い練習ではないと考えていることは明らかです。それは意味をなさない? –
あなたはこれが実際にサブクエリを必要とし、その考えは最初の最後のコメントをすべてのユーザーをフェッチしてステータスでフィルタリングされ
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を知ることは本当です。
質問モデルはどこにも言及していないため、正解ではありません。また、私は最後のコメントがステータスが偽のユーザーを取得したい。 –