Pesquisar string_to_array em Rails e PostgreSQL

Rails 3 não tem array: verdadeiro na migração, uma das muitas soluções é armazenar array como string, por exemplo
[1,2,3,4] torna-se ‘1,2,3,4’. Vamos ver os casos de estudo abaixo:

* PESQUISAR CADEIA NA MATRIZ DE TEXTO *

Migração de exemplo:

create_table :seo_configs do |t|
t
.text :keywords
t
.integer :user_id
t
.timestamps
end

SeoConfig.create(keywords: 'red,blue,yellow', user_id: 1)
SeoConfig.create(keywords: 'purple,black,blue', user_id: 2)

Se você deseja pesquisar [‘amarelo’, ‘azul’] como seus argumentos, a abordagem é:

SeoConfig.string_keywords('yellow','blue')

class SeoConfig < ActiveRecord::Base
scope
:string_keywords, ->(*keywords){ where("(string_to_array(keywords,',')::text[]) && (ARRAY[?]::text[])", keywords) }
end

#it will return any records that contains yellow or blue in column keywords

* PESQUISA DE STRING EM INTEGER ARRAY *

SeoConfig.create(keywords: '300,200,100', user_id: 2)

SeoConfig.create(keywords: '10,100,30,300', user_id: 1)

SeoConfig.integer_keywords(30, 200, 305)

class SeoConfig < ActiveRecord::Base
scope
:integer_keywords, ->(*keywords){ where("(string_to_array(keywords,',')::int[]) && (ARRAY[?]::int[])", keywords) }
end

# it will return any records that contain integer 30, 200 or 305 in column keywords

Você pode combinar sua pesquisa ou escopo com o Array Operator do Postgresql.

http://www.postgresql.org/docs/9.1/static/functions-array.html#ARRAY-OPERATORS-TABLE

E outros números de tipo de dados:

http://www.postgresql.org/docs/9.1/static/datatype-numeric.html

Outras soluções que você pode usar hstore in rails 4 ou array: true em sua migração. Outras boas joias:

https://github.com/jackc/surus

https://github.com/diogob/activerecord-postgres-hstore

http://codeloveandboards.com/blog/2014/07/16/rails-and-prostgresql-hstore-simple-use-case/