Rails:获取10分钟内用户的帖子

时间:2012-08-15 19:05:34

标签: ruby-on-rails ruby model geokit

我正在使用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 个答案:

答案 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

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

在上面的命令中,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]))