4

你好,我有一個Rails 3.2的問題和訂購。Rails 3 ORDER BY FIELD and last

當希望通過現場,電話.lastActiveRecord行爲古怪的命令集...

>> 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之後,而不是在括號內。

有沒有人有一個想法如何做到這一點?

謝謝!

回答

2

這是因爲ActiveRecord order方法不支持FIELD函數。使用順序方法將解析逗號作爲字段分隔符,並在調用last時將DESC附加到每個段。

作爲替代可以要麼)避免使用FIELD(或避免使用last,只是提供正向和反向範圍

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

然後就可以代替User.order(...).last

+0

呀,有時ActiveRecord的不能「反向」你'ORDER'指令,你必須做到這一點。 – tadman

2

使用User.reverse_order.first這是老但今天我遇到了這個問題,並找到了一個解決方法,不需要使用額外的範圍。

創建一個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