1

簡単な解決策があるはずなので、これはここ数時間私を夢中にさせてきました。次のモデルがあるとしましょう。

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」を使用できないためです。このようにする必要がある場合、配列内を検索してカウントを取得するにはどうすればよいですか?

どんな助けでも大歓迎です!

4

1 に答える 1

2

配列をフィルタリングしてから、その要素をカウントする必要があります。

post.comments.limit(5).select{ |comment| comment.flagged? }.size

またはそれより短い:

post.comments.limit(5).select(&:flagged?).size

注:selectはArrayのメソッドであり、SQLSelectステートメントとは何の関係もありません。

于 2012-07-23T23:58:59.707 に答える