【发布时间】:2015-09-03 09:02:52
【问题描述】:
我的 Rails 应用程序中有这两个模型:
create_table "projects", force: :cascade do |t|
...
t.float "latitude", limit: 24, default: 0.0
t.float "longitude", limit: 24, default: 0.0
用户:
create_table "users", force: :cascade do |t|
...
t.float "last_latitude", limit: 24, default: 0.0
t.float "last_longitude", limit: 24, default: 0.0111
我有一个自定义类:
class CalculusAid
public
# point_one and point_two are arrays of [latitude, longitude]
def self.distance point_one, point_two
first_point_latitude, first_point_longitude = point_one
second_point_latitude, second_point_longitude = point_two
latitude_difference_in_radians = (first_point_latitude - second_point_latitude).to_radians
longitude_difference_in_radians = (first_point_longitude - second_point_longitude).to_radians
#Math stuff
a = Math.sin(latitude_difference_in_radians/2) * Math.sin(latitude_difference_in_radians/2) +
Math.cos(first_point_latitude.to_radians) * Math.cos(second_point_latitude.to_radians) *
Math.sin(longitude_difference_in_radians/2) * Math.sin(longitude_difference_in_radians/2);
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
distance_in_kilometers = 6371 * c; # Multiply by 6371 to get Kilometers
return distance_in_kilometers
end
...
我不想做的是返回 5 个距离用户 0 到 50 公里的随机项目,我想用这样的方法来做到这一点
class User < ActiveRecord::Base
def get_nearby_projects
@nearby_projects = User.joins(:projects).where(CalculusAid.distance([self.last_longitude],self.last_latitude][project.longitude,project.latitude]) < 50).limit(5).order("RAND()")
end
但我不知道是否可以在 where 语句中使用自定义方法,或者语法是否正确。
【问题讨论】:
标签: mysql sql ruby-on-rails ruby activerecord