如何使用SQL ILIKE搜索查询ActiveRecord关联(.joins)

时间:2019-04-25 18:52:22

标签: sql ruby-on-rails postgresql

我试图通过将查询参数传递给控制器​​来查询多个活动记录模型。在我的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上的title-field所致。但是我自己无法解决此问题。

通过为索引方法提供正确的查询,我希望能够查询Tale-Model上的几个字段(即titlesubtitleshort_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 个答案:

答案 0 :(得分:1)

Rails中的表名按照约定以复数形式表示。因此,将其更改为

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

为了娱乐起见,在Postgres中ILIKE可以写为

.where('categories.title ~* ?', params[:search])