我正在尝试使用geokit-rails' .within模型实例方法中的辅助方法。看看这里:
def self.crunch
users = User.all
users.each do |user|
last_movement = Movement.where(user_id: user.id).try(:last)
if last_movement
users_near = Movement.where("user_id != ?", user.id).within(5, :origin => last_movement.user_lat, last_movement.user_lng)
else
next
end
if users_near.first
users_near.each do |near|
#Make sure they don't exist in MB table
#Check for interests
end
end
end
end
当我尝试运行该方法时,我不断收到错误:" SyntaxError:/Users/arsood/Documents/Consulting/SweetGlue_Service/app/models/matchbox.rb:10:语法错误,意外&#39 ;)'"
第10行是:
users_near = Movement.where("user_id != ?", user.id).within(5, :origin => last_movement.user_lat, last_movement.user_lng)
当我删除该行时,它工作正常。我需要在模型中调用Geokit方法而不是控制器吗?
答案 0 :(得分:1)
我认为关键是原点需要一个点或一个lat和lng数组,你传递2个参数所以synatx是错误的
这应该没有问题
users_near = Movement.where("user_id != ?", user.id).within(5, :origin => [last_movement.user_lat, last_movement.user_lng])
请允许我在您的代码中添加一些注释
where
始终返回一个有效的记录关系,如果没有记录,则无需使用last
try
如果您使用的是rails 4,那么有一个很好的Movement.where(user_id: user.id).last
方法用于活动记录,
所以你可以将你的查询改为这样的
not
如果添加一个实例方法,该方法返回一个有用的点数组
Movement.where.not(user_id: user.id).within(5, origin: [last_movement.user_lat, last_movement.user_lng])
查询会更简单
class Movement < ActiveRecord::Base
def point
[ user_lat, user_lng ]
end
end
我不确定用户循环是做什么的,但我认为它可以改进,如果你解释它的目的,我也可以帮忙。