我正在使用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,但我无法确定它。
我非常感谢你的帮助!
答案 0 :(得分: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
数组。
答案 1 :(得分:1)
如果您的用户型号has_many
发布,为什么不直接加载它们?
@posts = User.within(10, origin: [51.123123, 0.1323123]).collect(&:posts).flatten
collect
是map
的同义词,它有效地将数组转换为另一个数组,该数组将转换方法或块应用于原始数组的每个元素。
在上面的命令中,within
是一个命名范围,它返回一个Users
数组,collect
将方法posts
应用于每个用户,从而生成一个数组每个用户的帖子。最后,flatten
获取posts数组(它是一个二维数组)并将其转换为一大堆帖子。
您的includes
模型中也可以设置默认User
,以防止加载Posts
时出现N+1 query problem.。
FWIW,我更喜欢使用ActiveRecord方法(关联等),而不是尽可能使用原始SQL。
答案 2 :(得分:1)
试试这个解决方案:
class Post
acts_as_mappable through: :user
end
Post.joins(:user).within(10, origin: [51.123123, 0.1323123])
答案 3 :(得分:0)
Post.joins(:user).merge(User.within(10, origin: [51.123123, 0.1323123]))