4

您好,我对 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;

如您所见,在关系上调用 lastDESC两次 add ,但它应该只将其放在整个 之后ORDER BY FIELD,而不是放在括号内。

有谁知道怎么做?

谢谢!

4

2 回答 2

2

这是因为ActiveRecord方法FIELD不支持该功能。order使用 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

于 2012-08-23T17:34:56.687 回答
2

这很旧,但我今天遇到了这个问题,并找到了一种不需要使用额外范围的解决方法。

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

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

现在调用lastActiveRecord 可以:

User.order('field1(id)').last
于 2016-06-04T18:17:30.670 回答