mysql - 我可以在 WHERE 语句中使用自定义方法吗?

标签 mysql sql ruby-on-rails ruby activerecord

我的 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 语句中使用自定义方法或者语法是否正确。

最佳答案

这不可能直接实现,因为 Rails 只是构建一个由 MySQL 执行的查询,并从数据库服务器获取结果。这是一项原子操作,无法将 lambda 传递给 MySQL 来过滤结果。

但是 MySQL 有 built-in math functions :

@nearby_projects = ActiveRecord::Base.connection.execute <<-SQL
  SELECT * 
  FROM users
    JOIN projects ON (???) -- unclear from the code you’ve pasted
  WHERE
    50 > 6371 * (SIN(users.last_latitude + .......
SQL

希望有帮助。

关于mysql - 我可以在 WHERE 语句中使用自定义方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32371316/

相关文章:

mysql - 如何连接mvc和mysql?

mysql - 使用子查询一次更新 mysql 表中的所有行

sql - 从表中选择比较对

ruby-on-rails - ActiveRecord 回调和验证的顺序是什么?

ruby-on-rails - 链接到资源

mysqld.exe : Table '.\mysql\db' is marked as crashed and should be repaired

mysql - MySQL 中按 2 列分组并对其他 2 列求和

java - hibernate 查询: Joins and with query

android - ruby 试运行没有这样的文件或目录/platform-tools/adb (Errno::ENOENT)

php - 帮助逻辑