0

私はGeokitプラグインを使用して、current_userと他のユーザーの間の距離を計算しています(ジオコーディングは実際にプロファイルモデルに保存されています)。

テストの目的で、ミネソタ州ミネアポリスとミネソタ州セントポールに2人のユーザーを作成しました。Geokit gemを使用して、IRBセッションでプロファイルのlat/lngペアをジオコーディングしました。

インデックスビューを変更して、各プロファイルの名前、場所、およびlat/lngペアを一覧表示しました。これらの値は、データベースの値と一致します。

インデックスビューを変更して、current_userのlat/lngペアを表示しました。current_userのlat/lngペアが期待に一致することを確認するために、各ユーザーとして認証しました。しました。

llという名前のインスタンスメソッドをProfileモデルに追加して、lat/lngフィールドをLatLngオブジェクトとして返しました。

def ll
  #if lat and lng fields aren't empty
  LatLng.new(self.lat,self.lng) if (!self.lat.nil? && !self.lng.nil?)
end

ProfileControllerのIndexアクションのクエリを変更して、各ユーザーとcurrent_userの間の距離を計算しました。

@profiles = Profile.find(:all,
  :conditions => conditions,  # set WHERE clause
  :order => order_by, # set ORDER BY clause
  :origin => current_user.profile.ll,  # calculate distance based on current_user's location
  :units => :miles  # use miles

最後に、インデックスビューを変更して、current_userと個々のユーザーの間の距離を表示します。

<%=h profile.location %> (<%= profile.ll %>) -
<%= profile.distance.to_f.round(1) %> mi

ユーザーA(44.9799654、-93.2638361)として認証したとき、距離の計算は正しかった:

A(44.9799654、-93.2638361)-0.0マイルB(44.9444101、-93.0932742)-8.7 m

ただし、ユーザーB(44.9444101、-93.0932742)として認証した場合、距離の計算は正しくありませんでした。

A(44.9799654、-93.2638361)-32.8マイルB(44.9444101、-93.0932742)-41.1マイル

'raw' lat/lngペア間の距離計算を検証できました。

a = LatLng.new(44.9799654,-93.2638361)
=> #<Geokit::LatLng:0x1034af778 @lat=44.9799654, @lng=-93.2638361>
>> b = LatLng.new(44.9444101,-93.0932742)
=> #<Geokit::LatLng:0x1034aab88 @lat=44.9444101, @lng=-93.0932742>
>> a.distance_to(b)
=> 8.70261379563918
>> b.distance_to(a)
=> 8.70261379563918

何が起こっているのか説明するのに途方に暮れています。任意のアイデアをいただければ幸いです。

4

1 に答える 1

1

するとどうなりますか:

 @profiles = Profile.find(:all,
  :conditions => conditions,  # set WHERE clause
  :order => order_by, # set ORDER BY clause
  :origin => current_user.profile, # .ll # calculate distance based on current_user's location
  :units => :miles  # use miles

あなたのエラーは、データの丸め/変換の問題が発生していることを疑わせます。:originはlatとlngを直接取得できるはずです。Profile.find(...)を呼び出す直前に、関連するすべてのタイプをチェック(logger.debug)することもできます。

私はそれらの特定のエラーを与える単純な変換を思い付くことができませんでした、しかしそれは私の疑いです。それでも問題が解決しない場合は、生成したSQLを出力に追加できますか?それに基づいて何がうまくいかなかったのかを理解することができるかもしれません。

追加するために編集:

Craigは、型のデバッグを行うために、次のように与えます。

logger.debug("lat: #{current_user.profile.lat}  #{current_user.profile.lat.class.to_s} lng: #{current_user.profile.lng} #{current_user.profile.lng.class.to_s}")
logger.debug("lat: #{current_user.profile.ll.lat}  #{current_user.profile.ll.lat.class.to_s} lng: #{current_user.profile.ll.lng} #{current_user.profile.ll.lng.class.to_s}")

実際にエラーが発生しているときに試してから、development.logを確認してください。(注:ウィンドウに入力しているだけなので、そのコードにバグがある可能性がありますが、わかります。)それ以外の場合は、SQLクエリに表示される内容を確認する必要があります。文字列変換番号。

于 2010-05-20T22:59:04.470 に答える