【问题标题】:Rails ActiveRecord: PG::Error: ERROR: column reference "created_at" is ambiguousRails ActiveRecord:PG::Error:错误:列引用“created_at”不明确
【发布时间】:2013-05-29 14:46:27
【问题描述】:

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

这就是模型的样子:

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 查询(在错误消息下方)似乎没问题,但是是什么导致了错误消息?

提前谢谢你。

【问题讨论】:

  • 您确定您发布的查询中没有遗漏任何内容吗?对协会没有条件还是什么?某些东西正在应用日期条件,但查询中的任何内容都不应该这样做。
  • 是的,我完全确定。这就是错误如此奇怪的原因。
  • 类似的问题,看看吧。:stackoverflow.com/questions/15885335/…

标签: ruby-on-rails ruby postgresql activerecord join


【解决方案1】:

像这样定义一个范围:

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

而不是:

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

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

【讨论】:

  • 这对我来说不太适用。当我尝试order(name: :asc) 时,我得到了“{:name=>:asc}:Hash 的未定义方法'gsub'”。但是,我能够让order("users.name ASC") 工作。感谢您给我的答案的灵感!
  • 如果作用域是使用多列在哪里呢?
  • 定义 default_scope { order('created_at DESC') } 导致我同样的问题,通过删除它或更改为 default_scope { order(created: :desc) } 来修复它
【解决方案2】:

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

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

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

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

【讨论】:

  • 我遇到了类似的错误(不同的列),但它原来是一个排序列。感谢您的启发!
【解决方案3】:

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

【讨论】:

  • 我只是检查car_colors 迁移,是的,有t.timestamps - 但为什么会出现这个问题?无论如何,我会尝试删除它。第二句是什么意思?
  • 这是一个问题,因为 PG 无法知道您的意思是 created_atcars 还是 car_colors... SQL 不是一种允许歧义的语言:要么声明很清楚,没有解释的可能性,或者它不是并且应该被您看到的错误消息拒绝。
  • 这并不能解释为什么AND (created_at &gt; '2013-05-03 12:28:36.551058')会出现在SQL中,去掉时间戳不是解决办法,只是掩盖了问题。
  • @Matt:同意,但我们可能会遗漏让它出现的代码片段。
  • 这叫完美答案
猜你喜欢
  • 2015-01-07
  • 2018-07-02
  • 2018-01-26
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2020-12-22
  • 2015-12-31
  • 1970-01-01
相关资源
最近更新 更多