2012-04-03 11 views
11

Sto provando a trovare un record con il nome utente associato che è incluso in una relazione belongs_to, ma non funziona.rotaie criteri mongoid trovati per associazione

articoli appartengono agli utenti Gli utenti hanno molti articoli

Article.where(user_id: someid) funziona bene, ma mi piacerebbe usare il nome utente come riferimento che è memorizzato nella tabella Utenti.

Article.includes(:user).where(:username => "erebus") 
Article.includes(:user).where("user.username" => "erebus") 

Ho anche identity_map_enabled: true

Article.includes(:user).inclusions restituisce i dettagli di relazione

Non funziona, che cosa sono io non capire?

risposta

27

È necessario tenere presente che non ci sono join in mongodb. In db relazionale, includes forma una query di join e puoi utilizzare le colonne di entrambe le tabelle nella query. Tuttavia a causa dell'assenza di join in mongodb, lo stesso non è possibile.

In mongoid, includes salva solo alcune chiamate db. Raccoglie e archivia i record associati nella mappa delle identità per il recupero rapido, ma mentre è in corso una query, una query può gestire solo una raccolta.

Se avete bisogno di articoli basati su nomi utente, vorrei suggerire seguente lavoro intorno:

user_ids = User.where(username: 'erebus').only(:_id).map(&:_id) 
articles = Article.where(:user_id.in => user_ids) 
+0

cosa succede se otteniamo i dati dall'altra parte e non c'è in realtà alcuna matrice nella raccolta corrente, ma l'altro uno ? – Laurent

+0

oh sì, so la risposta: non puoi. – Laurent

13

si può fare poco più corto da quello che rubish suggerito:

user_ids = User.where(username: 'erebus').pluck(:id) 
articles = Article.where(:user_id.in => user_ids) 

Oppure uno di linea:

articles = Article.where(:user_id.in => User.where(username: 'erebus').pluck(:id)) 
+0

Ama anche l'unica fodera senza la funzione mappa – HoosierCoder