Rails ActiveRecord:PG ::错误:错误:列引用"created_at"不明确

use*_*621 22 ruby postgresql activerecord join ruby-on-rails

我正在努力解决对象中的错误,并且根本不确定问题在哪里.

这就是模型的样子:

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
Run Code Online (Sandbox Code Playgroud)

这是查询:

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

并输出错误:

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
Run Code Online (Sandbox Code Playgroud)

生成的SQL查询(在错误消息下面)似乎没问题,但是导致错误消息的原因是什么?

先感谢您.

Den*_*rdy 39

您的car_colors表中可能有一个created_at字段.created_at应该是cars.created_at消除歧义.

  • 这是一个问题,因为 PG 不知道你是指 `cars` 还是 `car_colors` 的 `created_at` ...... SQL 不是一种给歧义留有余地的语言:要么语句是清晰的,没有解释的可能性,或者它不是并且应该被拒绝并显示您看到的错误消息。 (2认同)

Ada*_*ite 23

定义这样的范围:

scope :scope_age, -> { order(created_at: :desc) }
Run Code Online (Sandbox Code Playgroud)

而不是:

scope :scope_age, -> { order("created_at DESC") }
Run Code Online (Sandbox Code Playgroud)

它通过使用定义范围的模型的属性来消除歧义.