Active Record 4 agora tem suporte para tipo de dados Array do PG. Veja como você pode usá-lo para fornecer aos usuários vários endereços de e-mail:
Migração:
class AddEmailsToUser < ActiveRecord::Migration
def change
add_column :users, :emails, :string, array: true, default: '{}'
end
end
Observe:
* é especificado como tipo de dados : string com array: true
* para padronizar a coluna para um array vazio ([]), você usa o padrão: ‘{}’
Para consultar seus registros, você deseja usar os métodos ANY e / ou ALL do PSQL :
SELECT * FROM users WHERE 'foo@bar.com' = ANY (emails);
SELECT * FROM users WHERE 'foo@bar.com' = ALL (emails);
… que se comportam como você imagina.
Usando a API de consulta do Active Record:
User.where("'foo@bar.com' = ANY (emails)")
É isso aí! Espero que ajude alguém.
EDIÇÃO DE BÔNUS 15/07/2013:
Para criar um índice para a coluna do array, você deve escolher entre GiST e GIN como estratégias. A documentação cobre as opções muito bem, mas a versão destilada é que as pesquisas GIN são muito (3x) mais rápidas, mas demoram mais (10x) para construir. Se seus dados são lidos com muito mais frequência do que gravados, vá para GIN.
Você faria isso com a seguinte migração (AR4):
class AddEmailIndexToUsers < ActiveRecord::Migration
def change
add_index :users, :emails, using: 'gin'
end
end
~ Stu