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.
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>
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)
#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>
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)
© 2024 OneMinuteCode. All rights reserved.