我想加入表格并使用 Geocoder Gem 对它们进行排序 模型关联

问题描述

我想解决什么

我想组合区域模型、商店模型和客户模型,并按照距离地理编码器 Gem 指定的位置的接近度顺序对结果进行排序。

我想在视图中使用 each 列出结果。

但是,我收到如下所示的 no such column: distance 错误

在这种情况下,不会发生错误

irb(main):043:0> Area.eager_load(:shop).near("tokyo")
  sql (0.4ms)  SELECT areas.*,(69.09332411348201 * ABS(areas.latitude - 35.6828387) * 0.7071067811865475) + (59.836573914187355 * ABS(areas.longitude - 139.7594549) * 0.7071067811865475) AS distance,CASE WHEN (areas.latitude >= 35.6828387 AND areas.longitude >= 139.7594549) THEN  45.0 WHEN (areas.latitude <  35.6828387 AND areas.longitude >= 139.7594549) THEN 135.0 WHEN (areas.latitude <  35.6828387 AND areas.longitude <  139.7594549) THEN 225.0 WHEN (areas.latitude >= 35.6828387 AND areas.longitude <  139.7594549) THEN 315.0 END AS bearing,"areas"."id" AS t0_r0,"areas"."prefectures" AS t0_r1,"areas"."municipalities" AS t0_r2,"areas"."house_number" AS t0_r3,"areas"."building_name" AS t0_r4,"areas"."postal_code" AS t0_r5,"areas"."created_at" AS t0_r6,"areas"."updated_at" AS t0_r7,"areas"."latitude" AS t0_r8,"areas"."longitude" AS t0_r9,"shops"."id" AS t1_r0,"shops"."shop_name" AS t1_r1,"shops"."created_at" AS t1_r2,"shops"."updated_at" AS t1_r3,"shops"."shop_type_id" AS t1_r4,"shops"."station_id" AS t1_r5,"shops"."area_id" AS t1_r6 FROM "areas" LEFT OUTER JOIN "shops" ON "shops"."area_id" = "areas"."id" WHERE (areas.latitude BETWEEN 35.3933751337783 AND 35.972302266221696 AND areas.longitude BETWEEN 139.40308602609107 AND 140.11582377390894) ORDER BY distance ASC LIMIT ?  [["LIMIT",11]]

这种情况下会出现错误

我希望它起作用。

irb(main):045:0> Area.eager_load(shop: :accounts).near("tokyo")
  sql (3.3ms)  SELECT disTINCT "areas"."id" FROM "areas" LEFT OUTER JOIN "shops" ON "shops"."area_id" = "areas"."id" LEFT OUTER JOIN "accounts" ON "accounts"."shop_id" = "shops"."id" WHERE (areas.latitude BETWEEN 35.3933751337783 AND 35.972302266221696 AND areas.longitude BETWEEN 139.40308602609107 AND 140.11582377390894) ORDER BY distance ASC LIMIT ?  [["LIMIT",11]]
Traceback (most recent call last):
ActiveRecord::StatementInvalid (sqlite3::sqlException: no such column: distance)

环境

  • Ruby 2.6.3
  • Rails 6.0.3
  • 地理编码器宝石:https://github.com/alexreisner/geocoder>

模型关联

# app/models/area

has_one :shop
# app/models/shop
belongs_to :shop_type
belongs_to :area
belongs_to :station

has_many :accounts
has_many :posts
# app/models/account

belongs_to :shop,optional: true
has_many :post

添加

我尝试了以下方法,但失败了。

irb(main):001:0> Area.near("tokyo").eager_load(shop: :accounts)
   (0.9ms)  SELECT sqlite_version(*)
  sql (0.4ms)  SELECT disTINCT "areas"."id" FROM "areas" LEFT OUTER JOIN "shops" ON "shops"."area_id" = "areas"."id" LEFT OUTER JOIN "accounts" ON "accounts"."shop_id" = "shops"."id" WHERE (areas.latitude BETWEEN 35.3933751337783 AND 35.972302266221696 AND areas.longitude BETWEEN 139.40308602609107 AND 140.11582377390894) ORDER BY distance ASC LIMIT ?  [["LIMIT",11]]
Traceback (most recent call last):
ActiveRecord::StatementInvalid (sqlite3::sqlException: no such column: distance)

irb(main):002:0> Area.near("tokyo").eager_load(shop: :accounts)
  sql (0.3ms)  SELECT disTINCT "areas"."id" FROM "areas" LEFT OUTER JOIN "shops" ON "shops"."area_id" = "areas"."id" LEFT OUTER JOIN "accounts" ON "accounts"."shop_id" = "shops"."id" WHERE (areas.latitude BETWEEN 35.3933751337783 AND 35.972302266221696 AND areas.longitude BETWEEN 139.40308602609107 AND 140.11582377390894) ORDER BY distance ASC LIMIT ?  [["LIMIT",11]]
Traceback (most recent call last):
ActiveRecord::StatementInvalid (sqlite3::sqlException: no such column: distance)
irb(main):003:0>

解决方法

文档中提到,

您不能将近作用域与提供 包含选项,因为由 Near 生成的 SELECT 子句将 覆盖它(反之亦然)。

不是使用包含来减少数据库查询的次数, 尝试将连接与 :select 选项或调用预加载一起使用。 例如:

那么,可以试试 Area.near("tokyo").eager_load(shop: :accounts)Area.near("tokyo").joins(shop: :accounts) 看看是否有效?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...