我不知道如何适当地计算范围内的对象。
对于此示例,我们假设产品(“skus”)具有 lat 和 lng,用户也是如此。
我有一个有效的 find_by_sql 示例:
def self.with_max_distance(user, distance)
Sku.find_by_sql(
<<-eos
SELECT *,
( 3959 * acos( cos( radians(#{user.lat}) ) * cos( radians( skus.lat ) )
* cos( radians(skus.lng) - radians(#{user.lng})) + sin(radians(#{user.lat}))
* sin( radians(skus.lat)))) AS distance
FROM skus
HAVING distance < #{distance}
eos
)
end
我能够使以下范围部分工作:
scope :scope_with_max_distance, lambda { |user, distance|
{ :select => "skus.*, ( 3959 * acos( cos( radians(#{user.lat}) ) * cos( radians( skus.lat ) ) * cos( radians(skus.lng) - radians(#{user.lng})) + sin(radians(#{user.lat})) * sin( radians(skus.lat)))) AS distance",
:having => "distance < #{distance}"
}
}
范围似乎可以正确获取对象,虽然我没有对其进行广泛测试,但如果我将它与其他范围链接起来,它似乎可以工作。
但是,我无法处理count()
这些对象,这真的很烦人。我知道我可以使用length()
,但它不适用于 count 的事实让我想知道是否有更好的方法来做到这一点。
1.9.3p125 :048 > Sku.scope_with_max_distance(User.first, 50).limit(10).count
User Load (0.5ms) SELECT `users`.* FROM `users` LIMIT 1
(0.6ms) SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM `skus` HAVING distance < 50 LIMIT 10) subquery_for_count
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'distance' in 'having clause': SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM `skus` HAVING distance < 50 LIMIT 10) subquery_for_count
我真的很感激任何建议或想法 - 我尝试了许多不同的方法,但无法找到一种完全有效的方法。如果问题需要更多澄清,请告诉我。