0

ポイントの距離内にあるユーザーを見つけることができる Rails 3 geokit gem を使用しています。

User.within(10, origin: [51.123123, 0.1323123])

[「10」は mi/km 単位の距離です。51 & 0 は緯度と経度]

ポイントから一定の距離内にいるユーザーによるすべての投稿を取得しようとしています。何かのようなもの:

Post.where(User.within(10, origin: [51.123123, 0.1323123]))

(私の Post モデルは、私の User モデルに属し、私の User モデルには、_多くの投稿があります)

それを読んでみると、解決策は .where にあるか、:through & :source を使用しているか、.joins を使用しているかのように見えますが、私はそれを突き止めることができませんでした。

どんな助けにもとても感謝しています!

4

4 に答える 4

1

この解決策を試してください:

class Post
  acts_as_mappable through: :user
end

Post.joins(:user).within(10, origin: [51.123123, 0.1323123])
于 2012-08-19T12:55:28.497 に答える
1

もっと洗練された解決策があるかもしれませんが、最も簡単なのは SQL で IN を使用することだと思います。次のようにします。

Post.where(["user_id IN (?)", User.within(10, origin: [51.123123, 0.1323123]).map { |u| u.id }])

基本的に、一致する可能性user_idsのある配列を送信しているだけです。Post.user_id

于 2012-08-15T19:09:01.170 に答える
1

User モデルhas_manyが投稿する場合、それらを直接ロードしないのはなぜですか?

@posts = User.within(10, origin: [51.123123, 0.1323123]).collect(&:posts).flatten

collectは の同義語でmapあり、変換メソッドまたはブロックを元の配列のすべての要素に適用して、配列を別の配列に効果的に変換します。

上記のコマンドでは、 の配列をwithin返す名前付きスコープであり、メソッドを各ユーザーに適用して、ユーザーごとの投稿の配列を生成します。最後に、投稿配列の配列 (2 次元配列) を取り、それを投稿の 1 つの大きな配列に押し込みます。Userscollectpostsflatten

N+1 クエリの問題includesを防ぐために、Userモデルにデフォルトを設定することもできます。ロード中。Posts

FWIW、可能であれば生の SQL を使用する代わりに、ActiveRecord メソッド (関連付けなど) を使用することを好みます。

于 2012-08-15T19:11:49.290 に答える
0
Post.joins(:user).merge(User.within(10, origin: [51.123123, 0.1323123]))
于 2012-08-15T21:29:39.207 に答える