轨道:获取距离点 10 公里范围内的用户帖子



我正在使用 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]))

(我的帖子模型belongs_to我的用户模型,我的用户模型has_many帖子)

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

我将非常感谢任何帮助!

试试这个解决方案:

class Post
  acts_as_mappable through: :user
end
Post.joins(:user).within(10, origin: [51.123123, 0.1323123])

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

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

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

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

您还可以在User模型中设置默认includes,以防止出现 N+1 查询问题。 加载Posts 时。

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

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

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

基本上,您只是发送Post.user_id可以匹配的一系列user_ids

Post.joins(:user).merge(User.within(10, origin: [51.123123, 0.1323123]))

最新更新