2012-02-27 9 views
12

Dopo aver letto: thisActiveRecord - come ottenere tutte le colonne di tabelle unite

io ancora non capisco. in console:

puts Category.joins(:posts) 

Esegue join o left join su Category e Post.

Tuttavia, tutti i dati restituiti sono solo colonne nella tabella di categoria. Come ottenere anche i dati di colonna in Post. ?

devo fare un altro modello per raggiungere questo obiettivo?

dopo la lettura: this Is find_by_SQL è l'unico modo? Voglio ActiveRecord se possibile.

Grazie.

+0

Dovresti essere più specifico su ciò che cerchi di ottenere. Se si desidera "il modo Active Record", non si dovrebbe nemmeno parlare di "colonne" perché si manipolano gli oggetti, non le tabelle. Se hai davvero bisogno dei dati grezzi, puoi usare 'ActiveRecord :: Base.connection.select_all ('SELECT ...')', questo ti restituirà un array di hash (nessuna istanza del modello). [La documentazione è qui] (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-select_all) –

+0

grazie, sto usando in questo modo la società: ActiveRecord :: Base.connection .select_all (Category.joins (: posts) .to_sql)), è così troppo brutto? –

+0

Nessun problema. Tuttavia, se si vuole veramente lavorare in modo ORM, si dovrebbe usare solo questo tipo di trucchi per query SQL davvero complesse. Per un problema così insignificante, utilizzerei invece la soluzione di @ abhishek + 'includes'. Perché preoccuparsi di utilizzare un ORM se non si esegue il codice in modalità OO? –

risposta

4

è possibile ottenere colonne di messaggi tabelle facendo un'ulteriore interrogazione, qualcosa di simile -

Category.joins(:posts).collect{|category| category.posts.map{|post| post.attributes.merge(category.attributes) } } 

Questo vi darà una lista gigante di posta e attributi di categoria riuniti per ogni categoria.

Ma il punto di fare il join su Categoria è quello di ottenere una serie di categorie che hanno certe seguire alcuni criteri di join. Se prendiamo l'esempio successivo nella stessa guida,

Post.joins(:category, :comments) 

Questo ti dà anche un elenco dei soli messaggi, ma la lista contiene solo i post che seguono il vincolo unirsi, che è, tutti hanno una categoria e un commento.

+3

Attenzione, il 'collect' risulterà probabilmente in un problema di query N + 1 . Per evitare ciò, usa 'includes'. vedi [le guide RoR sul caricamento ansioso] (http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations) –

+0

@m_x ovviamente, quel codice è strettamente per dimostrazione. – abhishek

+0

grazie a @m_x e abhishek –

6

Si può provare a selezionare il metodo():

Category.select("categories.*, posts.*").joins(:posts) 
+1

Grazie per la risposta. Questo non può funzionare. Restituisce comunque solo "categorie. *". Sempre se l'SQL generato è "SELECT categorie. *, I messaggi. * Da ... –

+0

Come si fa a controllare se funziona? Ho appena provato, funziona bene per me. – Ineu

+0

corro questo comando in 'rotaie console' Utilizzo di puts e ap (impressionante stampa): inserisce Category.select ("categorie. *, Post. *"). Joins (: post) Restituisce solo l'oggetto <. all'interno. –

Problemi correlati