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/