Rails 具有多个连接和参数的范围
Rails Scope with Multiple Joins and Parameters
我尝试了其他问题的解决方案,但仍然遇到问题。我似乎也找不到调试查询的好方法,所以我只能反复试验。
我正在 Service
上创建一个范围。
我的 Service
与 `Affiliate 有一个可选的 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
我的 Affiliate
与 AffiliatePlan
有 belongs_to
关系:
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
class 中的最新尝试:
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
的单复数形式。我总是得到一个空的关系。我已经尝试在没有连接表的情况下使用英里的设定值并获得了服务,所以看起来事情的地理空间方面正在发挥作用。
以下是我如何让它工作的:
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])
}
我最大的困惑之一是我不需要为范围所在的模型加入 table。
我发现如果我调用 Service.within_with_cat(lat, lon).any?
我会收到调试所需的错误消息。当我调用 Service.within_with_cat(lat, lon)
时,我只会收到一个没有错误的关系。
我尝试了其他问题的解决方案,但仍然遇到问题。我似乎也找不到调试查询的好方法,所以我只能反复试验。
我正在 Service
上创建一个范围。
我的 Service
与 `Affiliate 有一个可选的 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
我的 Affiliate
与 AffiliatePlan
有 belongs_to
关系:
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
class 中的最新尝试:
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
的单复数形式。我总是得到一个空的关系。我已经尝试在没有连接表的情况下使用英里的设定值并获得了服务,所以看起来事情的地理空间方面正在发挥作用。
以下是我如何让它工作的:
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])
}
我最大的困惑之一是我不需要为范围所在的模型加入 table。
我发现如果我调用 Service.within_with_cat(lat, lon).any?
我会收到调试所需的错误消息。当我调用 Service.within_with_cat(lat, lon)
时,我只会收到一个没有错误的关系。