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]))

(我的帖子模型属于_我的用户模型,我的用户模型有_许多帖子)

阅读它似乎解决方案在于 .where,或使用 :through & :source 或 .joins,但我无法确定它。

我将非常感谢任何帮助!

4

4 回答 4

1

可能有更优雅的解决方案,但我认为最简单的可能是将 IN 与 SQL 一起使用。执行以下操作:

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

如果您的用户模型has_many发布,为什么不直接加载它们?

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

collect是 的同义词map,它有效地将一个数组转换为另一个数组,将转换方法或块应用于原始数组的每个元素。

在我们上面的命令中,within是一个命名范围,它返回一个 数组Userscollect将该方法posts应用于每个用户,从而为每个用户生成一个帖子数组。最后,flatten获取帖子数组的数组(它是一个二维数组)并将其压缩成一个大的帖子数组。

includes您还可以在模型中使用默认值User来防止N+1 查询问题。加载时Posts

FWIW,我更喜欢使用 ActiveRecord 方法(关联等),而不是尽可能使用原始 SQL。

于 2012-08-15T19:11:49.290 回答
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 回答
0
Post.joins(:user).merge(User.within(10, origin: [51.123123, 0.1323123]))
于 2012-08-15T21:29:39.207 回答