2013-06-03 15 views
16

Mam problem z błędem w obiekcie i nie jestem pewien, gdzie jest problem.Rails ActiveRecord: PG :: Błąd: ERROR: odwołanie do kolumny "created_at" jest niejednoznaczne

ten sposób modele wygląda następująco:

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 

Oto zapytanie:

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

a wyjście błędu:

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 

Wygenerowany zapytań SQL (poniżej komunikat o błędzie) wydaje się być w porządku, ale co powoduje komunikat o błędzie?

Z góry dziękuję.

+3

Are jesteś pewien, że nic nie brakuje w wysłanym zapytaniu? Brak warunków w stowarzyszeniach czy cokolwiek? Coś stosuje warunek daty, ale nic w zapytaniu nie powinno tego robić. – Matt

+0

Tak, jestem całkowicie pewien. Właśnie dlatego błąd jest taki dziwny. – user984621

Odpowiedz

30

Prawdopodobnie istnieje pole created_at w tabeli car_colors. created_at prawdopodobnie powinien być cars.created_at, aby usunąć niejednoznaczność.

+0

Właśnie sprawdzam migrację "car_colors" i tak, jest "t.timestamps" - ale dlaczego jest ten problem? W każdym razie spróbuję go usunąć. Co masz na myśli przez zdanie drugie? – user984621

+1

To jest problem, ponieważ PG nie może wiedzieć, czy masz na myśli 'created_at' dla' cars' lub 'car_colors' ... SQL nie jest językiem, który daje jakiekolwiek pole do niejednoznaczności: albo oświadczenie jest jasne bez możliwości interpretacja, lub nie jest i powinna zostać odrzucona z komunikatem o błędzie, który widzisz. –

+0

To nie wyjaśnia, dlaczego '' ((created_at> '2013-05-03 12: 28: 36.551058') pojawia się w SQL, usunięcie znacznika czasu nie jest rozwiązaniem, po prostu pomija problem. – Matt

1

Nie usunąć znaczniki czasu z modelu przyłączenia, nie są problemem - problemem jest to, że coś jest dodanie warunku do zapytania:

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

Ponieważ termin wynosi jeden miesiąc temu przeszukaj kod pod numerem one.month.ago i sprawdź, czy pojawia się w dowolnych zakresach, prawdopodobnie w modelach samochodów lub modeli samochodów. Sprawdź zakresy ręcznie, jeśli nic nie pojawi się podczas wyszukiwania.

Usunięcie znaczników czasu spowoduje, że zapytanie zadziała, ale nie jest to właściwe.

+0

Otrzymałem podobny błąd (inna kolumna), ale okazało się, że jest to kolumna sortująca. Dzięki za inspirację! –

16

Zdefiniuj zakres takiego:

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

zamiast:.

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

usuwa niejednoznaczność za pomocą właściwości modelu, w której zakres jest określony w

+0

To mi nie pomogło. Otrzymałem "nieokreśloną metodę" gsub "dla {: name => asc}: Hash" kiedy próbowałem 'order (name:: asc)'. Jednak udało mi się uzyskać 'order (" users.name ASC ")' do pracy. Dzięki za inspirację, która doprowadziła mnie do mojej odpowiedzi! – Yetti

+1

A jeśli zakres używa wielokolumnowy, gdzie? – TiggerToo

Powiązane problemy