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

Qua*_*tum 3 activerecord ruby-on-rails-3

我有以下查询正常工作

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

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

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

但是我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

小智 15

order('users.created_at DESC')

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


its*_*ols 0

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

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

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

  • 也许更改此字段名称不是一个好主意,因为它是由 Rails 自己生成和使用的。 (2认同)