Postgres accent insensitive LIKE search in Rails 3.1 on Heroku

后端 未结 5 2115
无人及你
无人及你 2021-02-05 11:11

How can I modify a where/like condition on a search query in Rails:

find(:all, :conditions => [\"lower(name) LIKE ?\", \"%#{search.downcase}%\"])

5条回答
  •  谎友^
    谎友^ (楼主)
    2021-02-05 11:46

    First of all, you install postgresql-contrib. Then you connect to your DB and execute:

    CREATE EXTENSION unaccent;
    

    to enable the extension for your DB.

    Depending on your language, you might need to create a new rule file (in my case greek.rules, located in /usr/share/postgresql/9.1/tsearch_data), or just append to the existing unaccent.rules (quite straightforward).

    In case you create your own .rules file, you need to make it default:

    ALTER TEXT SEARCH DICTIONARY unaccent (RULES='greek');
    

    This change is persistent, so you need not redo it.

    The next step would be to add a method to a model to make use of this function.

    One simple solution would be defining a function in the model. For instance:

    class Model < ActiveRecord::Base
        [...]
        def self.unaccent(column,value)
            a=self.where('unaccent(?) LIKE ?', column, "%value%")
            a
        end
        [...]
    end
    

    Then, I can simply invoke:

    Model.unaccent("name","text")
    

    Invoking the same command without the model definition would be as plain as:

    Model.where('unaccent(name) LIKE ?', "%text%"
    

    Note: The above example has been tested and works for postgres9.1, Rails 4.0, Ruby 2.0.

    UPDATE INFO
    Fixed potential SQLi backdoor thanks to @Henrik N's feedback

提交回复
热议问题