2013-06-03 31 views
16

Tôi đang đấu tranh với lỗi trong đối tượng và không chắc chắn ở tất cả các nơi là vấn đề.Rails ActiveRecord: PG :: Lỗi: LRI: tham chiếu cột "created_at" là mơ hồ

Đây là cách các mô hình trông giống như:

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 

Đây là truy vấn:

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

Và đầu ra lỗi:

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 

Các truy vấn SQL được tạo ra (dưới thông báo lỗi) có vẻ ổn, nhưng điều gì gây ra thông báo lỗi?

Cảm ơn bạn trước.

+3

đang bạn chắc chắn không có gì thiếu từ truy vấn bạn đã đăng? Không có điều kiện trên các hiệp hội hay bất cứ điều gì? Một cái gì đó đang áp dụng một điều kiện ngày nhưng không có gì trong truy vấn nên làm điều đó. – Matt

+0

Vâng, tôi hoàn toàn chắc chắn. Đó là lý do tại sao các lỗi rất lạ. – user984621

Trả lời

30

Có thể có trường created_at trong bảng car_colors của bạn. created_at có thể là cars.created_at để xóa sự mơ hồ.

+0

Tôi chỉ kiểm tra di chuyển 'car_colors' và có, có' t.timestamps' - nhưng tại sao lại là vấn đề này? Dù sao, tôi sẽ cố gắng loại bỏ nó. Bạn có ý gì với câu thứ hai? – user984621

+1

Đó là vấn đề bởi vì PG không thể biết bạn có nghĩa là 'created_at' cho' cars' hay 'car_colors' ... SQL không phải là ngôn ngữ cho phép bất kỳ chỗ nào mơ hồ: hoặc tuyên bố rõ ràng không có khả năng giải thích, hoặc nó không phải là và nên bị từ chối với thông báo lỗi mà bạn đang nhìn thấy. –

+0

Điều này không giải thích tại sao 'AND (created_at> '2013-05-03 12: 28: 36.551058')' xuất hiện trong SQL, việc loại bỏ dấu thời gian không phải là một giải pháp, nó chỉ làm sáng tỏ vấn đề. – Matt

1

Không tháo timestamps của bạn từ mô hình tham gia, họ không phải là vấn đề - vấn đề là một cái gì đó là thêm một điều kiện để truy vấn của bạn:

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

Kể từ ngày là một tháng trước, tìm kiếm mã của bạn cho one.month.ago và xem mã có xuất hiện ở bất kỳ phạm vi nào, có thể là trong các mẫu ô tô hoặc xe hơi của bạn. Kiểm tra phạm vi theo cách thủ công nếu không có gì xuất hiện thông qua tìm kiếm.

Xóa dấu thời gian sẽ làm cho truy vấn của bạn hoạt động, nhưng đó không phải là điều đúng để làm.

+0

Tôi đã nhận được một lỗi tương tự (cột khác nhau) nhưng nó hóa ra lại là một cột sắp xếp. Cảm ơn vì nguồn cảm hứng! –

16

Xác định một phạm vi như thế này:

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

hơn là:.

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

Nó loại bỏ sự nhập nhằng bằng cách sử dụng tài sản của mô hình trong đó phạm vi được định nghĩa trong

+0

Điều này không hoàn toàn phù hợp với tôi. Tôi đã nhận được "phương pháp undefined 'gsub' cho {: name =>: asc}: Hash" khi tôi đã thử 'order (name:: asc)'. Tuy nhiên, tôi đã có thể nhận được 'thứ tự (" users.name ASC ")' để làm việc. Cảm ơn nguồn cảm hứng đã đưa tôi đến câu trả lời của tôi! – Yetti

+1

Và nếu phạm vi đang sử dụng nhiều cột ở đâu? – TiggerToo

Các vấn đề liên quan