首页 > 解决方案 > 具有多个连接和参数的 Rails 范围

问题描述

我已经尝试过其他问题的解决方案,但仍然遇到问题。我似乎也找不到调试查询的好方法,所以我只能使用试错法。

我正在创建一个范围Service

My与 `AffiliateService有可选的belongs_to关系:

class Service < ApplicationRecord
    belongs_to :affiliate,  optional: true
end 

Service还有一lonlat列:

create_table "services", force: :cascade do |t|
    t.bigint "affiliate_id"
    t.geography "lonlat", limit: {:srid=>4326, :type=>"st_point", :geographic=>true}
    t.index ["affiliate_id"], name: "index_services_on_affiliate_id"
    t.index ["lonlat"], name: "index_services_on_lonlat", using: :gist
  end

我与以下Affiliatebelongs_to关系AffiliatePlan

class Affiliate < ApplicationRecord
    belongs_to :affiliate_plan
end 

AffiliatePlan有一个radius_miles专栏:

create_table "affiliate_plans", force: :cascade do |t|
    t.decimal "radius_miles"
end 

AffiliatePlan给定经度和纬度,我的目标是从坐标中找到位于其半径 范围内的所有服务。

这是我在Service课堂上的最新尝试:

scope :within_with_cat, -> (latitude, longitude){ 
    joins(:services, :affiliates, :affiliate_plans)
        .where("ST_Distance(service.lonlat, 'POINT(:lo :la)') < (affiliate_plan.radius_miles * 1609.34)", lo: longitude, la: latitude)
}

我试过单数和复数的service.lonlat。我总是得到一个空的关系。我已经尝试过不使用里程设置值的连接表,并且已经恢复了服务,所以看起来地理空间方面的工作正在发挥作用。

标签: ruby-on-railsjoinscoperuby-on-rails-5

解决方案


以下是我如何让它工作:

scope :within_with_cat, -> (latitude, longitude){ 
    joins(affiliate: [ :affiliate_plan])
        .where(['(ST_Distance(lonlat, \'POINT(%f %f)\') < (affiliate_plans.radius_miles * 1609.34))', longitude, latitude])
}

我最大的困惑之一是我不需要为范围所在的模型加入表格。

我发现如果我打电话,Service.within_with_cat(lat, lon).any?我会收到调试所需的错误消息。当我打电话时,Service.within_with_cat(lat, lon)我只会收到没有错误的关系。


推荐阅读