Rails ActiveRecord:PG::Error:错误:列引用“created_at”不明确

Posted

技术标签:

【中文标题】Rails ActiveRecord:PG::Error:错误:列引用“created_at”不明确【英文标题】:Rails ActiveRecord: PG::Error: ERROR: column reference "created_at" is ambiguous 【发布时间】: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 查询(在错误消息下方)似乎没问题,但是是什么导致了错误消息?

提前谢谢你。

【问题讨论】:

您确定您发布的查询中没有遗漏任何内容吗?对协会没有条件还是什么?某些东西正在应用日期条件,但查询中的任何内容都不应该这样做。 是的,我完全确定。这就是错误如此奇怪的原因。 类似的问题,看看吧。:***.com/questions/15885335/… 【参考方案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:同意,但我们可能会遗漏让它出现的代码片段。 这叫完美答案

以上是关于Rails ActiveRecord:PG::Error:错误:列引用“created_at”不明确的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3 包括翻译 globalize3 activerecord

脱离Rails单独使用ActiveRecord的几点需知

没有Rails的ActiveRecord

Rails/Arel:选择所有记录作为 ActiveRecord::Relation

为啥 Rails 5 使用 ApplicationRecord 而不是 ActiveRecord::Base?

Rails 扩展 ActiveRecord::Base