where
を使用して浮動小数点検索を検索するのが、以下のように機能しない理由を理解できますか?ActiveRecordここで、Float == Floatが空の配列を返す
> latitude = 37.9763
37.9763
> Branch.first.latitude
# Branch Load (0.4ms) SELECT `branches`.* FROM `branches` ORDER BY `branches`.`id` ASC LIMIT 1
37.9763
> Branch.first.latitude.class
Float < Numeric
> latitude.class
Float < Numeric
> Branch.where(latitude: latitude)
# Branch Load (11.7ms) SELECT `branches`.* FROM `branches` WHERE `branches`.`latitude` = 37.9763
[]
私もBranch.where("latitude = ?", latitude)
を試してみましたが、私は私の心を失うことをしなければならない[]
を得ます。好奇心旺盛な人のため
> Branch.where('latitude = ?', Branch.first.latitude)
# Branch Load (0.4ms) SELECT `branches`.* FROM `branches` ORDER BY `branches`.`id` ASC LIMIT 1
# Branch Load (11.3ms) SELECT `branches`.* FROM `branches` WHERE (latitude = 37.9763)
[]
、私はこれはおそらくどのようfloating point numbers are representedに起こっている重複
hash = Branch.group(:business_name, :latitude, :longitude).count
hash.select{|k,v| v > 1}.each do |groupings, count|
business_name = groupings[0]
latitude = groupings[1]
longitude = groupings[2]
branches = Branch.where(
business_name: business_name,
latitude: (latitude - 0.0001)..(latitude + 0.0001),
longitude: (longitude - 0.0001)..(longitude + 0.0001)
)
puts "#{business_name} Count = #{count}"
puts "#{business_name} Branch Count = #{branches.count}"
puts "no match" if count != branches.count
end
あなたは(Branch.whereを試してみました緯度:緯度.to_f)? – power
はい、ありましたが、クラスが既に一致しているため、実際には必要ありません。 – Abram
ActiveRecordがクエリに対して生成する生のSQLを提供してください。アプリケーションログから取得できます。リレーションに対して '.to_sql'を呼び出すこともできます。 –