Запрос из двух таблиц по одному и тому же условию - PullRequest
0 голосов
/ 25 июня 2019

Я создаю страницу поиска, которая будет возвращать результаты двух моделей AHotel и BHotel.Я хотел бы запросить обе таблицы по одному и тому же параметру, т. Е. Я хотел бы, чтобы все AHotels и все BHotels имели атрибут города, например "Нью-Йорк".

Моя страница поиска всегда должна показывать AHotels до BHotels.Я хотел бы, чтобы массив возвращался с All AHotels в nyc, за которым следует BHotels в nyc.

AHotel.where("city ILIKE ?", "%#{city}%").or(BHotel.where("city ILIKE ?", "%#{city}%"))

AHotel.includes(:bhotel).where("ahotels.city ILIKE :search OR bhotels.city ILIKE :search", search: "new york").references(:bhotels)

Когда я бегу Hotel.where("city ILIKE ?", "New York").count, я получаю 37.

И когда я бегу BHotel.where("city ILIKE ?", "New York").count, яполучить 600.

Но когда я запускаю любой из первых двух запросов, я получаю только счет 37. Кажется, он только возвращает AHotels.

Как сделать запрос из обеих таблиц по городам?Я не хочу запускать два отдельных запроса, так как собираюсь разбить результаты на страницы.

Пример AHotel Records

{"id" => 1, "name"=>"Hyatt Place", "address"=>"Cox Rd", "state"=>"VA", "city"=>"nyc", "country"=>"US"} 


{"id" => 2, "name"=>"Hyatt Place", "address"=>"Cox Rd", "state"=>"VA", "city"=>"la", "country"=>"US"}

Пример BHotel Records

{"id" => 1, "prop_name"=>"Marriott", "address"=>"Cox Rd", "state"=>"VA", "city"=>"nyc", "country"=>"US"}

{"id" => 2, "prop_name"=>"Hilton", "address"=>"Cox Rd", "state"=>"VA", "city"=>"denver", "country"=>"US"}

То, что я хотел бы вернуть

Массив с AHotel с ID = 1 и BHotel с ID = 2, так как они оба имеют своигород установлен на Нью-Йорк.

[{"id" => 1, "name"=>"Hyatt Place", "address"=>"Cox Rd", "state"=>"VA", "city"=>"nyc", "country"=>"US"}, {"id" => 1, "prop_name"=>"Marriott", "address"=>"Cox Rd", "state"=>"VA", "city"=>"nyc", "country"=>"US"}]

1 Ответ

0 голосов
/ 25 июня 2019

Если вы используете STI ( Single Table Inheritance ) для расширения таблицы Hotel на типизированные классы AHotel и BHotel, вы можете запросить таблицу Hotel напрямую: Hotel.where("citiy ILIKE :search", search: 'New York').order(:type, ...) , В результате вы получите как AHotel, так и BHotel.

Если у вас на самом деле есть две физические таблицы в вашей базе данных, вы можете использовать STI как лучшую архитектуру проектирования, которая позволит выполнять такие запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...