2013-06-03 20 views
16

Sono alle prese con l'errore nell'oggetto e non sono affatto sicuro di dove sia il problema.Rails ActiveRecord: PG :: Errore: ERRORE: il riferimento alla colonna "created_at" è ambiguo

Questo è come i modelli assomiglia:

class Car < ActiveRecord::Base 
    has_many :car_colors 
    has_many :colors, :through => :car_colors 
end 

class CarColor < ActiveRecord::Base 
    belongs_to :color 
    belongs_to :car 
end 

class Color < ActiveRecord::Base 
    has_many :car_colors 
    has_many :cars, :through => :car_colors 
end 

Ecco la domanda:

@cars = Car.all(:joins => :car_colors, :conditions => { :car_colors => {:color_id => params[:id_number]}}, :order => "cars.created_at DESC") 

E l'uscita di errore:

PG::Error: ERROR: column reference "created_at" is ambiguous 
LINE 1: ...d" WHERE "car_colors"."color_id" = 2 AND (created_at... 
                  ^
: SELECT "cars".* FROM "cars" INNER JOIN "car_colors" ON "car_colors"."car_id" = "cars"."id" WHERE "car_colors"."color_id" = 2 AND (created_at > '2013-05-03 12:28:36.551058') ORDER BY cars.created_at DESC 

La query SQL generato (al di sotto della messaggio di errore) sembra essere a posto, ma cosa causa il messaggio di errore?

Grazie in anticipo.

+3

Sono sei sicuro che non ci sia nulla che manca nella query che hai postato? Nessuna condizione sulle associazioni o qualcosa del genere? Qualcosa sta applicando una condizione di data ma nulla nella query dovrebbe farlo. – Matt

+0

Sì, ne sono completamente sicuro. Ecco perché l'errore è così strano. – user984621

risposta

30

Probabilmente c'è un campo created_at nella tabella car_colors. created_at dovrebbe probabilmente essere cars.created_at per rimuovere l'ambiguità.

+0

Sto solo controllando la migrazione di 'car_colors' e sì, ci sono' t.timestamps' - ma perché questo problema? Ad ogni modo, proverò a rimuoverlo. Cosa intendi con la seconda frase? – user984621

+1

È un problema perché PG non può sapere se stai significando 'created_at' per' cars' o 'car_colors' ... L'SQL non è un linguaggio che lascia spazio all'ambiguità: o l'affermazione è chiara senza possibilità di interpretazione, o non lo è e dovrebbe essere rifiutato con il messaggio di errore che stai vedendo. –

+0

Questo non spiega perché 'AND (created_at> '2013-05-03 12: 28: 36.551058')' viene visualizzato nell'SQL, la rimozione del timestamp non è una soluzione, ma semplicemente sorvola il problema. – Matt

1

non rimuovete la timestamp dal modello aderire, non sono il problema - il problema è che qualcosa è l'aggiunta di una condizione alla tua richiesta:

AND (created_at > '2013-05-03 12:28:36.551058') 

Dal momento che la data è di un mese fa, cerca il tuo codice per one.month.ago e vedi se appare in qualsiasi ambito, probabilmente nei tuoi modelli di auto o di car_colors. Controllare manualmente gli ambiti se non viene visualizzato nulla durante la ricerca.

La rimozione dei timestamp farà sì che la query funzioni, ma non è la cosa giusta da fare.

+0

Stavo ricevendo un errore simile (colonna diversa) ma si è rivelato essere una colonna di ordinamento. Grazie per l'ispirazione! –

16

definire un ambito come questo:

scope :scope_age, -> { order(created_at: :desc) } 

piuttosto che:.

scope :scope_age, -> { order("created_at DESC") } 

Si rimuove l'ambiguità utilizzando la proprietà del modello in cui il campo di applicazione è definito in

+0

Questo non ha funzionato abbastanza per me. Stavo ricevendo "metodo non definito 'gsub' per {: name =>: asc}: Hash" quando ho provato 'order (name:: asc)'. Tuttavia, sono stato in grado di ottenere 'order (" users.name ASC ")' per funzionare. Grazie per l'ispirazione che mi ha portato alla mia risposta! – Yetti

+1

E se l'ambito utilizza una colonna multipla dove? – TiggerToo

Problemi correlati