Mysql2 ::错误:order子句中的'created_at'列不明确

时间:2011-05-02 15:44:41

标签: ruby-on-rails-3 activerecord

我有以下查询正常工作

ObjectItem.find(:all, :include => :object_groups, :conditions =>  "object_items.description LIKE '%#{search}%' OR object_groups.description LIKE '%#{search}%'", :order => 'object_items.created_at DESC')

但是这种方式的查询现已弃用,因此我正在尝试更改为此表单

ObjectItem.order('object_items.created_at DESC').includes(:object_groups).where("object_items.description LIKE '%#{search}%' OR object_groups.description LIKE '%#{search}%'")

但是我收到以下错误:

Mysql2::Error: Column created_at in order clause is ambiguous: SELECT  DISTINCT `object_items`.id FROM `object_items` LEFT OUTER JOIN `object_groups_object_items` ON `object_groups_object_items`.`object_item_id` = `object_items`.`id` LEFT OUTER JOIN `object_groups` ON `object_groups`.`id` = `object_groups_object_items`.`object_group_id` WHERE (object_items.description LIKE '%%' OR object_groups.description LIKE '%%') ORDER BY object_items.created_at DESC, created_at DESC  LIMIT 20 OFFSET 0

6 个答案:

答案 0 :(得分:14)

order('users.created_at DESC')

基本上问题是可能存在连接查询,因此表中都有created_at字段,因此抛出错误。 如果要根据create_at表格对结果进行排序,请使用您在其上订购结果的table_name.field_name。

答案 1 :(得分:1)

ORDER BY object_items.created_at DESC, created_at DESC LIMIT 20 OFFSET 0

正如之前的回答所说,它有一个悬挂的“created_at”,可以引用任一表中的列。

显然不是你用.order直接传入的那个 - 所以也许你的模型中有一个默认范围和默认顺序。 如果您明确指出object_items.created_at它可能会解决问题。

答案 2 :(得分:1)

试试这个: 订单(' users.created_at DESC') 要么 order(created_at :: asc)

应该为同样的事情工作

答案 3 :(得分:0)

这通常是多个表中出现相同字段名称的结果。

在你的情况下,看起来object_items和object_groups都有相同的字段'created_at'。

最好的事情(在我看来)是通过(例如)使用字段名称的前缀重命名其中一个表中的字段。

答案 4 :(得分:0)

您是如何在ObjectItem模型中定义object_groups关系的?

ORDER BY created_ar如果您在ObjectItem中具有类似于以下的关系,则可以将DESC添加到查询中:

has_many :object_groups, :order => "created_at DESC"

答案 5 :(得分:-1)

我今天在一个Spree项目上遇到了这个问题。它几乎总是由于将表名保留在order子句之外。请参阅此故障单,了解我如何解决问题:https://github.com/spree/spree/issues/2654

在我的情况下,我在我的一个狂欢模型中添加了一个装饰器,它添加了一个没有相应表名的订单子句。