Как выполнить поиск и сопоставление ассоциаций ActiveRecord (.joins) с помощью SQL ILIKE - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь запросить несколько активных моделей записей, передавая параметры запроса в контроллер.Внутри моего tales_controller.rb у меня есть следующий метод индекса:

def index
  @tales_count = Tale.all.count

  if params[:search]
    @tales = Tale.joins(:category)
                 .where('category.title ILIKE ?', "%#{params[:search]}%")
                 .where(
                   'title ILIKE :search OR
                   subtitle ILIKE :search OR
                   short_description ILIKE :search', search: "%#{params[:search]}%"
                  )
  else
    @tales = Tale.all
  end

  render template: 'tales/index'
end

Теперь я не могу найти правильное решение этой проблемы, так как по большей части PG выдает ошибку, говоря:: PG::AmbiguousColumn: ERROR: column reference "title" is ambiguous.Я чувствую, что это связано с тем, что я пытаюсь запросить поле заголовка в Tale-, а также в Category-Model.Однако я сам не могу решить эту проблему.

Предоставляя метод index с правильными запросами, я ожидаю, что смогу запросить пару полей в Tale-Model (а именно title, * 1009).* и short_description и, возможно, больше), а также поле title в модели категорий.

Модель категорий ссылается на модель сказок.Вот как выглядит schema.rb:

create_table "tales", force: :cascade do |t|
  t.string "public_id"
  t.string "title"
  t.string "subtitle"
  t.string "player_count"
  t.string "short_description"
  t.datetime "published_at"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.bigint "category_id"
  t.bigint "author_id"
  t.index ["author_id"], name: "index_tales_on_author_id"
  t.index ["category_id"], name: "index_tales_on_category_id"
end

РЕДАКТИРОВАТЬ: хм, я просто понял, что, запрашивая способ, которым я сейчас занимаюсь, я ожидаю, что category.title И любое из других полей Taleнести поисковый термин.Честно говоря, это не то, что я хотел.

1 Ответ

1 голос
/ 25 апреля 2019

Имя таблицы в Rails условно во множественном числе. Так что измените это, чтобы прочитать

.where('categories.title ILIKE ?', "%#{params[:search]}%")

и просто для удовольствия ILIKE в Postgres можно записать как

.where('categories.title ~* ?', params[:search]) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...