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: 構文エラー、予期しない ')'」というエラーが発生し続けます。

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

ポイントは、原点には緯度と経度のポイントまたは配列が必要であるということだと思います.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 に答える