0

我正在尝试在模型实例方法中使用 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: syntax error, unexpected ')'”

第 10 行是:

users_near = Movement.where("user_id != ?", user.id).within(5, :origin => last_movement.user_lat, last_movement.user_lng)

当我删除该行时,它工作正常。我需要在模型而不是控制器中调用 Geokit 方法吗?

4

1 回答 1

1

我认为关键是 origin 需要一个点或一个 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如果没有记录,运行它会返回 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)
    
  • 我不确定用户循环做了什么,但我认为它可以改进,如果你解释它的目的是什么,我也可以提供帮助。

于 2015-03-27T06:19:25.960 回答