Как настроить поисковый запрос - PullRequest
0 голосов
/ 29 сентября 2019

Я создаю приложение Rails 5, и в этом приложении я позволяю своим пользователям добавлять профиль поиска для квартир, которые они ищут.

Они могут добавить к своему объекту User следующее:

  • min_size
  • max_size
  • min_price
  • max_price
  • комнаты

Так, например, пользователь может бытьищем квартиру с минимальной (min_size) 100 фут2 и максимальной (max_size) 200 фут2.Они хотят платить только минимум (min_price) 500 долларов в месяц и максимум (max_price) 1200 долларов в месяц, а в квартире должно быть минимум (комнаты) из 3 комнат.

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

Как я могу создать SQL, где запрос проверяет это?

Thisэто то, что я пытаюсь использовать как метод класса для объекта User.

def self.match(size, price, rooms)
  User.where("size_min >= ? AND size_max <= ? AND price_min >= ? AND price_max <= ? AND rooms == ?", size, size, price, price, rooms)
end

Запущенный запрос будет

User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE (size_min >= 100 AND size_max <= 100 AND price_min >= 600 AND price_max <= 600 AND rooms == 3) LIMIT ?  [["LIMIT", 11]]

Но это выглядит не совсем хорошо.У меня есть образец объекта User ниже, которому я хочу соответствовать.

<User id: 12, provider: "email", allow_password_change: false, firstname: "John", lastname: "Doe", email: "example@gmail.com", phone: "32323", area: "San Antonio", rooms: 3, size_min: 100, size_max: 200, price_min: 500, price_max: 1200, is_admin: true, created_at: "2019-09-26 15:43:15", updated_at: "2019-09-26 22:06:34"> 

Информация об объекте для квартиры не диапазоны, а абсолютные данные:

[{"rooms":"3","size":"80","price":"7315"}]

1 Ответ

1 голос
/ 29 сентября 2019

Похоже, что ваш запрос содержит неправильные проверки неравенства, попробуйте следующий, вместо этого

def self.match(size, price, rooms)
  User.where("(? BETWEEN size_min AND size_max) AND (? BETWEEN price_min AND price_max) AND rooms = ?", size, price, rooms)
end

Ref: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_between

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