I want to sort the results of combining multiple tables in Rails using Geocoder Gem

Asked 2 years ago, Updated 2 years ago, 32 views

I would like to combine Area Model, Shop Model, and Account Model to get the results of sorting in order close to the location specified in Geocoder Gem.

I would like to use each to list what I have acquired in View.

Patterns with no errors

irb(main): 013:0>Area.eager_load(:shop).near("tokyo")
  SQL (0.9ms)  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.1158377390894) ORDER BY distance ASCLIMIT?[[[[[LIMIT], 11]]]
=> #<ActiveRecord::Relation [#<Area id: 107, prefectures: "東京都", municipalities: "大田区", house_number: "山王", building_name: nil, postal_code: nil, created_at: "2021-07-11 07:03:13", updated_at: "2021-07-11 07:03:13", latitude: 35.5871768, longitude: 139.7246486967578>, #<Area id: 108, prefectures: "東京都", municipalities: "大田区", house_number: "梅屋敷", building_name: nil, postal_code:nil, created_at: "2021-07-1107:04:31", updated_at: "2021-07-1107:04:31", latitude:35.5669662, longitude:139.728368>] >
irb(main): 014:0>

Error Patterns

I want to make this a success.
However, the no such column:distance error occurs as shown below.

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)

Model association

#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): 144:0>Area.near("tokyo").joins(shop::accounts)
  Area Load (0.3ms)  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 FROM "areas" INNER JOIN "shops" ON "shops"."area_id" = "areas"."id" INNER 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 ASCLIMIT?[[["LIMIT", 11]]
=>#<ActiveRecord::Relation[]>
irb(main): 145:0>

ruby-on-rails ruby

2022-09-29 21:40

1 Answers

Area.near("tokyo").joins(shop:accounts) should be correct as far as the query is concerned.

Probably no relevant shop and account data from the area being searched

Try left_joins.

Area.near("tokyo").left_joins(shop:accounts)


2022-09-29 21:40

If you have any answers or tips


© 2024 OneMinuteCode. All rights reserved.