我正试图在模型实例方法中的helper方法中使用geokit rails的.int。看看这里:
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:语法错误,意外的')'"
第10行是:
users_near = Movement.where("user_id != ?", user.id).within(5, :origin => last_movement.user_lat, last_movement.user_lng)
当我去掉这条线时,它工作得很好。有没有一种不同的方法需要我在模型而不是控制器中调用Geokit方法?
我认为重点是原点需要一个点或lat和lng的数组,您传递了2个参数,所以synatrx是错误的
这应该工作没有问题
users_near = Movement.where("user_id != ?", user.id).within(5, :origin => [last_movement.user_lat, last_movement.user_lng])
请允许我在您的代码上添加一些注释
where
总是返回一个活动记录关系,如果没有记录,则在该关系上运行last
将返回nil,无需使用try
Movement.where(user_id: user.id).last
如果你使用rails 4,有一个很好的
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
查询会更简单
users_near = Movement.where.not(user_id:user.id).within(5, origin: last_movement.point)
我不确定用户循环的作用,但我认为它可以改进,如果你解释一下它的意图,我也可以帮助你。