30

我正在努力解决对象中的错误,完全不确定问题出在哪里。

这是模型的样子:

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

这是查询:

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

和错误输出:

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

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

先感谢您。

4

3 回答 3

54

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

于 2013-06-03T12:46:09.933 回答
27

定义这样的范围:

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

而不是:

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

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

于 2014-06-17T21:52:13.927 回答
1

不要从连接模型中删除您的时间戳,它们不是问题 - 问题是某些东西正在为您的查询添加条件:

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

由于日期是一个月前,请搜索您的代码one.month.ago并查看它是否出现在任何范围内,可能在您的汽车或 car_colors 模型中。如果通过搜索没有任何结果,请手动检查范围。

删除时间戳将使您的查询正常工作,但这不是正确的做法。

于 2013-06-03T14:18:30.733 回答