我正在利用Select2实现自动完成,以从JSON中获得AJAX加载的用户列表,从而填充多值选择框。
到目前为止,我已经能够通过参考以下来源来实现大多数所需的功能:
http://gistflow.com/posts/428-autocomplete-with-rails-and-select2
http://luksurious.me/?p=46
我的问题是,自动完成查询区分大小写。我需要它不区分大小写。通过一点研究,我发现了一个GitHub问题,Select2创建者解释说"Ajax匹配应该在服务器端完成。">
https://github.com/ivaynberg/select2/issues/884
经过多次尝试和广泛的研究,我没有找到解决案件敏感性问题的解决方案。不幸的是,"服务器端匹配"有点让我难以理解,我想知道是否有人能为这个问题提出解决方案?
以下是我迄今为止的工作:
哈姆尔
= hidden_field :recipient_id, "", data: { source: users_path }, class: "select2-autocomplete"
CoffeeScript
$ ->
$('.select2-autocomplete').each (i, e) ->
select = $(e)
options = {
multiple: true
}
options.ajax =
url: select.data('source')
dataType: 'json'
data: (term, page) ->
q: term
page: page
per: 5
results: (data, page) ->
results: data
options.dropdownCssClass = 'bigdrop'
select.select2 options
用户控制器
class UsersController < ApplicationController
def index
@users = User.order('name').finder(params[:q]).page(params[:page]).per(params[:per])
respond_to do |format|
format.html
format.json { render json: @users }
end
end
end
用户模型
class User < ActiveRecord::Base
scope :finder, lambda { |q| where("name like :q", q: "%#{q}%") }
def as_json(options)
{ id: id, text: name }
end
end
想明白了!
答案在于查询中的自定义作用域和LIKE子句。LIKE是一个区分大小写的子句。由于我使用的是PostgreSQL,所以我可以将LIKE子句更改为ILIKE,这是不区分大小写的。
因此,为了获得不区分大小写的匹配,用户模型应该如下所示:
用户模型
class User < ActiveRecord::Base
scope :finder, lambda { |q| where("name ILIKE :q", q: "%#{q}%") }
def as_json(options)
{ id: id, text: name }
end
end