2014-09-24 10 views
7
Experiment has_many :features 
Feature belongs_to :experiment 

Experiment.where("experiments.id=1") 
    .joins(:features) 
    .pluck("features.id", "experiments.id") 

Mi aspetto che questo restituisca l'ID di ciascuna funzione e l'id dell'esperimento.Rails ".pluck" su tabelle unite con colonne con lo stesso nome restituisce un valore e quindi nil

[ 
    [1, 1], 
    [2, 1], 
    [3, 1], 
    # .... 
] 

Invece questo restituisce l'id della sperimentazione e quindi nullo

[ 
    [1, nil], 
    [1, nil], 
    [1, nil], 
    # .... 
] 

Questo è strano in tre per quanto riguarda:

  • anche se si tratta di un inner join e solo un esperimento è restituito Sono in grado di strappare colonne dalle funzioni (features.name)
  • tutto va bene finché non viene ripetuto il nome di una colonna.
  • l'ultima colonna tratteggiata viene riportata per prima, come se la prima colonna venisse sovrascritta. Commutando l'ordine di prelevamento si cambia il valore restituito.

Questo sembra un errore ma forse sto facendo qualcosa di sbagliato. Qualche consiglio?

uscita SQL:

SELECT features.id, experiments.id FROM "experiments" INNER JOIN "features" ON "features"."experiment_id" = "experiments"."id" WHERE (experiments.id=1) 

Nota. Questa è una domanda semplificata relativa a una query simile a:

Experiment.where("experiments.id=1") 
    .joins(feature: { child2: { :child3 } }) 
    .pluck("feature.id, child3.id") 
+0

Non è sicuro, provare: 'Experiment.where (: id => 1) .joins (: caratteristiche) .pluck ("experiments.id, features.id")'? – Surya

+0

@Surya Rails è difficile rispondere .. :-) Prima di rispondere dobbiamo creare il modello e inserire i dati .. Troppo lavoro :-) –

+0

Stessa produzione. Anche se ho appreso che un hash è più intelligente di una stringa ("id = 1") nel selezionare la colonna corretta da cercare. – nate

risposta

6

Questo è un po 'complicato. Poiché esiste una INNER JOIN, la query produce solo uno id in questa istanza. Si può effettivamente formare interrogare il contrario:

Feature.joins(:experiment) 
     .where(features: { experiment_id: 1 }) 
     .pluck(:id, :experiment_id) 

Oppure:

Feature.joins(:experiment) 
     .where(experiments: { id: 1 }) 
     .pluck(:id, :experiment_id) 
+1

Amico! Che sintassi '' caratteristiche: {experiment_id: 1} 'sta facendo? –

+0

all'interno di 'where' il metodo cercherà la tabella:' features' e formerà una query come: 'features.experiment_id = 1' :) – Surya

+0

Non ho mai visto questa sintassi (nuova per me) .. Dove l'hai trovata? –

Problemi correlati