【问题标题】:Rails 3 ORDER BY FIELD and lastRails 3 ORDER BY FIELD 和最后
【发布时间】:2012-08-23 17:19:52
【问题描述】:

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

您可以看到在关系上调用 last 两次添加 DESC,但它应该只将它放在整个 ORDER BY FIELD 之后,而不是放在括号内..

有人知道怎么做吗?

谢谢!

【问题讨论】:

    标签: mysql ruby-on-rails activerecord sql-order-by ruby-on-rails-3.2


    【解决方案1】:

    这是因为 ActiveRecord order 方法不支持 FIELD 函数。使用 order 方法将解析出逗号作为字段分隔符,并在您调用 last 时将 DESC 附加到每个段。

    作为替代方案,您可以避免使用 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

    【讨论】:

    • 是的,有时 ActiveRecord 无法“反转”您的 ORDER 指令,您必须这样做。
    【解决方案2】:

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

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

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

    现在可以在 ActiveRecord 中调用 last

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

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 2011-11-18
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2020-08-25
      • 1970-01-01
      相关资源
      最近更新 更多