6

Sto provando a sviluppare una relazione molti-a-molti tra tag (nella tabella tags) e articoli (nella tabella items) utilizzando un campo di tipo integer[] su ciascun articolo.Combinare array postgres_ext (o Rails 4) con associazioni

So che Rails 4 (e Rails 3 via postgres_ext) supporta la funzionalità di array di Postgres tramite il parametro :array => true, ma non riesco a capire come combinarli con le associazioni di Active Record.

has_many ha un'opzione per questo? C'è una gemma per questo? Dovrei rinunciare e creare solo una relazione has_many :through (anche se con la quantità di relazioni che mi aspetto è probabilmente ingestibile)?

risposta

4

Tutto ciò che dovete fare è

def tags 
    Tag.where(id: tag_ids) 
end 

def add_tag(tag) 
    self.tag_ids += [tag.id] unless tag_ids.include?(tag.id) 
end 

Almeno questo è quello che faccio in questo momento. Faccio anche alcune cose interessanti con hash (hstore) e permessi. Un modo per gestire i tag consiste nel creare has_many through e persistere i tag in una colonna di array di stringhe quando vengono aggiunti per comodità e prestazioni (non è necessario interrogare le 2 tabelle correlate solo per ottenere i nomi). Non è necessario utilizzare record attivi per fare cose interessanti con il database.

5

A questo punto, non esiste un modo per utilizzare le relazioni con gli array in Rails. Usando la risposta selezionata, però, ti imbatterai nel problema di selezione N + 1. Supponiamo che tu riceva i tuoi post e poi i tag per ogni post con il metodo "tags" definito nella classe. Per ogni post in cui chiami i tag, incorrerai in un altro hit del database.

Speriamo che questo cambi in futuro e che possiamo sbarazzarci della tabella di join (soprattutto considerando che Postgres 9.4 includerà il supporto per le chiavi esterne negli array).