ActiveRecord随机向ORDER BY添加“DESC”

时间:2014-07-18 00:14:08

标签: ruby-on-rails ruby activerecord rails-activerecord

当我致电以下时间时:

organization = Organization.first
organization.members.order("SUBSTRING_INDEX(SUBSTRING_INDEX(members.name, ' ', 3), ' ', -1)").last

给我以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 
'DESC, ' ' DESC, 3) DESC, ' ' DESC, -1) DESC LIMIT 1' at line 1: 
SELECT  `members`.* FROM `members`  WHERE `members`.`organization_id` = 2
ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(members.name DESC, ' ' DESC, 3) DESC, ' ' DESC, -1) DESC LIMIT 1

问题出在本声明中:

SUBSTRING_INDEX(SUBSTRING_INDEX(members.name DESC, ' ' DESC, 3) DESC, ' ' DESC, -1) DESC LIMIT 1

它会在ORDER BY语句中随机添加“DESC”。这是AR问题还是我做错了什么?

注意:这只在我致电last时才会发生。我正在使用ActiveRecord 4.1.1

1 个答案:

答案 0 :(得分:0)

ActiveRecord或AREL内部的一些内容正在假设SQL ORDER BY子句中的逗号含义。假设ORDER BY是一个看起来像expr1, expr2, ...的字符串,在单个表达式中没有逗号。

当您添加.last时,AR最终会在查询中调用reverse_orderreverse_order对ORDER BY子句的格式做出了愚蠢的假设,它(或它调用的东西)假设SQL ORDER BY看起来像expr1, expr2, ...,在单个表达式中没有逗号。当reverse_order尝试撤销订单时,它会盲目地将逗号分隔ORDER BY字符串并将这些部分与DESC一起粘贴在不同的位置。如果您的ORDER BY使用" advanced"这当然不起作用。像函数调用这样的东西。

您可以将该函数调用添加到SELECT并为其添加别名,然后.order('your_column_alias')隐藏AR中的逗号。

您还可以假装last不存在并改为使用first

organization.members.order("SUBSTRING_INDEX(...) DESC").first

这当然假设你知道ORDER BY的结构。