我正在使用 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
collect
是map
的同义词,它有效地将一个数组转换为另一个数组,将变换方法或块应用于原始数组的每个元素。
在上面的命令中,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]))