簡単な解決策があるはずなので、これはここ数時間私を夢中にさせてきました。次のモデルがあるとしましょう。
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
また、コメントモデルにはFlaggedという属性があります。投稿に10個のコメントがあり、最初の2つと最後の2つがフラグ付きとしてマークされていると仮定します。
投稿の最初の5つのコメントのうちフラグが付けられたものの数を取得したいと思います。この場合、2を返したいと思います。それで、最初に私は試しました:
post.comments.limit(5).where(comments: { flagged: true }).count
しかし、これは4を返します。これは、フラグが立てられた最初の5つのレコードが真であることが検出されるため意味があります。私の質問は、限られた結果セットだけをどうやって数えることができるかということです。私は試した:
first_five_comments = post.comments.limit(5)
first_five_comments.where(flagged: true).count
これは、リレーションをチェーンして上記と同じクエリを実行するだけなので、4も返します。
まっすぐなSQLステートメントでこれを実行できることはわかっていますが、それを実行するためのRailsの方法はもっとあるはずです。上記のステートメントに.allを追加してから、返された配列内でカウントを行う必要がありますか?明らかにこれは機能しません:
first_five_comments = post.comments.limit(5).all
first_five_comments.where(flagged: true).count
配列で「where」を使用できないためです。このようにする必要がある場合、配列内を検索してカウントを取得するにはどうすればよいですか?
どんな助けでも大歓迎です!