2

特定の数のメッセージと nil ではない post.location を持つ投稿を特定してカウントしたいと思います。

私は約 100k 行を持っており、それは統計的な用途のためのものなので、高速なクエリが必要です (ちなみに、post.location にインデックスを付ける必要があるかもしれません)。

どうすれば最も簡単かつ迅速に行うことができますか?

ここに私のスキーマがあります:

create_table "posts", :force => true do |t|
  t.string   "ref"
  t.string   "title"
  t.string   "author"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "location"
  t.float    "lat"
  t.float    "long"
end

create_table "messages", :force => true do |t|
  t.integer  "post_id"
  t.integer  "status_id"
  t.integer  "user_id"
  t.string   "content"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.float    "lat"
  t.float    "long"
end

add_index "messages", ["post_id"], :name => "index_messages_on_post_id"
add_index "messages", ["created_at"], :name => "index_messages_on_created_at"
4

3 に答える 3

3

探している SQL クエリは次のようになります。

SELECT COUNT(posts.id)
FROM posts
JOIN messages ON (posts.id = messages.post_id)
GROUP BY (posts.id) HAVING (count(messages.id) > ?)
WHERE posts.location IS NOT NULL

次に、それを ActiveRecord クエリに変換するか、単にfind_by_sql. (これは記憶から書いたので、いくつかの場所で微調整する必要があるかもしれません..しかし、一般的なアイデアはうまくいくはずです)。

于 2012-07-30T09:05:41.360 に答える
1

このスコープを Post モデルで使用できます

スコープ :give_a_valid_name, ラムダ {|n| joins(:messages).having("COUNT(messages.id) = #{n}").where("location IS NOT NULL")}

次に、Post.give_a_valid_name(5).size を使用して、5 つのメッセージを持つ投稿の数を取得します。

お役に立てれば。

于 2012-07-30T10:02:55.243 に答える
0

OK Tigraine と az7ar の両方の回答のおかげで、なんとかやり遂げることができました。うまくいったのは次のとおりです。

Post.joins(:messages).select('post_id as id').group("post_id").having("count(*) = 1").where('location IS NOT NULL')

JOIN のアドバイスをくれた Tigraine と.where("location IS NOT NULL")構文について az7ar に感謝します。

于 2012-07-30T11:17:58.207 に答える