Rails базовый поиск и PostgreSQL - PullRequest
0 голосов
/ 11 марта 2012

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

def self.search(title, category_id, city_id)
    if title || category_id || city_id
      joins(:category).where('title LIKE (?) AND category.category_id IN (?) AND city.city_id IN (?)', "%#{title}%", "%#{category_id}%", "%#{city_id}%")
    else
      scoped
    end
  end

У меня есть следующие ассоциации в моей модели:

  has_one :category
  has_one :city

И я получаю эту ошибку

ActionView::Template::Error (PG::Error: ERROR:  missing FROM-clause entry for ta
ble "category"
LINE 1: ..._id" = "events"."id" WHERE (title LIKE ('%%') AND category.c...

Я используюPostgreSQL.Что я могу сделать, чтобы удалить эту ошибку?

1 Ответ

7 голосов
/ 11 марта 2012

Форма joins, которую вы используете, хочет имя ассоциации, SQL хочет имя таблицы. Таблица должна называться categories.

Несколько других вещей:

  1. Я не вижу, чтобы вы где-то присоединились к :city, поэтому вашей следующей ошибкой будет "Отсутствует запись предложения FROM для таблицы" city ". Решением будет .joins(:city) и использование cities в where Но все равно продолжайте читать.
  2. Вам не нужны скобки вокруг значения для LIKE, просто title LIKE ? хорошо.
  3. Вы используете выражения IN для категории и города, но вы даете им шаблоны LIKE, и это не сработает: идентификаторы будут числами, и вы можете использовать LIKE с числами. Если вы используете IN, то обычно вам нужно предоставить список возможных значений, если вы хотите сопоставить только одно значение, тогда просто используйте = и одно значение для заполнителя.
  4. Таблица categories, вероятно, не имеет столбца category_id, аналогично для таблицы cities и столбца city_id. Эти два столбца должны быть в таблице вашей модели.
  5. Поиск заголовка, когда у вас нет заголовка, не имеет особого смысла. Аналогично для страны и города.

Это похоже на множество проблем, но их можно исправить без особых усилий:

def self.search(title, category_id, city_id)
    rel = scoped
    rel = rel.where('title    like ?', "%#{title}%") if(title)
    rel = rel.where('category_id = ?', category_id)  if(category_id)
    rel = rel.where('city_id     = ?', city_id)      if(city_id)
    rel
end

и вам даже не нужны joins или явные имена таблиц вообще.

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