我有以下查询正常工作
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
答案 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
在我的情况下,我在我的一个狂欢模型中添加了一个装饰器,它添加了一个没有相应表名的订单子句。