ruby-on-rails - 具有多个连接和参数的 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
我与以下Affiliate
有belongs_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
。我总是得到一个空的关系。我已经尝试过不使用里程设置值的连接表,并且已经恢复了服务,所以看起来地理空间方面的工作正在发挥作用。
解决方案
以下是我如何让它工作:
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)
我只会收到没有错误的关系。
推荐阅读
- javascript - JSON层次结构:犹豫如何实现它
- ruby-on-rails - Rails - 如何将方法委托给集合
- c# - 从列表框中选择多个项目以添加到二维数组并传递到另一个页面 UWP C#
- javascript - 通过 Promise Chain (angularjs) 传递数据
- python - 如何在列表元素中添加锚点
- javascript - 使用 Javascript 将字符串拆分为 JS 对象或 JSON 对象
- android - 无法重新加载 JSON 数据
- javascript - 使用 Node REPL 记录 __dirname 的值
- mobx - .map() 通过带有 Mobx Observable Map 的键
- javascript - 具有多个选择器类的 insertBefore()