Rails 3中按字段和最后一个(Rails 3 ORDER BY FIELD and last)

2019-09-21 13:42发布

你好,我有使用Rails 3.2和排序的问题。

希望通过现场订购集合时,打电话时.last ActiveRecord行为古怪...

   >> User.order("FIELD(id, '1')")
   User Load (0.4ms)  SELECT `users`.* FROM `users` ORDER BY FIELD(id, '1')
   => []
   >> User.order("FIELD(id, '1')").first
   User Load (0.4ms)  SELECT `users`.* FROM `users` ORDER BY FIELD(id, '1') LIMIT 1
   => nil
   >> User.order("FIELD(id, '1')").last
   User Load (0.3ms)  SELECT `users`.* FROM `users` ORDER BY FIELD(id DESC, '1') DESC LIMIT 1
   Mysql2::Error: You have an error in your SQL syntax;

正如你所看到的最后调用的关系添加DESC的两倍,但它应该只把它整个后ORDER BY FIELD ,而不是在括号内..

不要任何人有一个想法,怎么办呢?

谢谢!

Answer 1:

这是因为该FIELD的功能不被支持的ActiveRecord的order方法。 使用顺序方法解析出逗号作为字段分隔符和追加DESC每个段当你调用last

作为替代方案,你可以避免使用FIELD(),或避免使用last ,只是提供正向和反向范围

scope :forward_order, order("FIELD(id, '1') ASC")
scope :reverse_order, order("FIELD(id, '1') DESC")

然后你可以使用User.reverse_order.first代替User.order(...).last



Answer 2:

这是旧的,但我今天遇到这个问题,发现并不需要使用额外的范围的一种变通方法。

创建一个SQL函数来包装调用FIELD ,这样就会出现在调用中没有逗号order 。 这是PostgreSQL的,但翻译很简单:

CREATE FUNCTION field1(value text) RETURNS text AS $$
BEGIN
  RETURN FIELD(value, 1);
END;
$$ LANGUAGE plpgsql IMMUTABLE

调用last在ActiveRecord的现在工作:

User.order('field1(id)').last


文章来源: Rails 3 ORDER BY FIELD and last