当我致电以下时间时:
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
。
答案 0 :(得分:0)
ActiveRecord或AREL内部的一些内容正在假设SQL ORDER BY子句中的逗号含义。假设ORDER BY是一个看起来像expr1, expr2, ...
的字符串,在单个表达式中没有逗号。
当您添加.last
时,AR最终会在查询中调用reverse_order
。 reverse_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的结构。