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_at
是 cars
还是 car_colors
... SQL 不是一种允许歧义的语言:要么声明很清楚,没有解释的可能性,或者它不是并且应该被您看到的错误消息拒绝。
这并不能解释为什么AND (created_at > '2013-05-03 12:28:36.551058')
会出现在SQL中,去掉时间戳不是解决办法,只是掩盖了问题。
@Matt:同意,但我们可能会遗漏让它出现的代码片段。
这叫完美答案以上是关于Rails ActiveRecord:PG::Error:错误:列引用“created_at”不明确的主要内容,如果未能解决你的问题,请参考以下文章
Rails 3 包括翻译 globalize3 activerecord
Rails/Arel:选择所有记录作为 ActiveRecord::Relation