2012-12-10 63 views
0

我使用的Rails 3.2 Ruby和我想知道是否有一種方法可以做如下:是否可以在'order'方法子句中使用問號?

@categories.order('user_id = ? DESC', params[:id]) 
@categories.order('user_id = ? DESC', @user.id) 

# Note: It is almost the same as `@categories.where('user_id = ?', params[:id])` 
# but for the `order` clause. 

上述聲明生成此錯誤:

ActiveRecord::StatementInvalid (Mysql2::Error: 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, ... 
+0

您可以使用Ruby字符串插值的ActiveRecord :: Base的。 sanitize_sql_array。 – Hck

+0

我從來沒有使用[sanitize_sql_array](http://apidock.com/rails/ActiveRecord/Sanitization/ClassMethods/sanitize_sql_array)方法。你能提供一個例子說明你如何在我的情況下使用它(使用'order'子句)? – Backo

+0

''@categories.order ActiveRecord :: Base.send(:sanitize_sql_array,['user_id =?',@ user.id])' – Hck

回答

2

如果你試圖改變基礎上,user_id的順序,返回那些符合第一,你應該使用CASE聲明。

在原始SQL,它應該是這樣的:

SELECT * FROM Categories ORDER BY CASE user_id WHEN 34 THEN 1 ELSE 2 END 

這將使所有行user_id是34到頂部,留下其餘爲默認排序。

與其他人一樣,order沒有任何消毒SQL的機制,因此您必須在ActiveRecord::Base上使用受保護的類方法。

它可能看起來像這樣:

order_sql = Category.send :sanitize_sql_array, ["CASE user_id WHEN ? THEN 1 ELSE 2 END", some_user_id] 

@categories.order(order_sql) 
+0

'CASE user_id WHEN 34 THEN 1 ELSE 2 END'語句到底是什麼?它怎麼能「把所有的'user_id'都是'34'的行放在最上面,其餘的都是默認的排序」?我從來沒有聽說過......是否它應該真正用於像問題中解釋的情況? – Backo

+0

當您執行訂單聲明時,sql正在使用字段的值進行排序。所以,如果你有'SELECT * FROM categories ORDER BY user_id',它將取'user_id'的值來應用這個排序。使用case語句,您將截取'user_id'的值並根據條件返回1或2。由於1在2之前,因此被置於頂端。 –

+0

此外,你從來沒有解釋這是什麼用於你的問題。我只是在猜測你的意圖。你想做什麼? –

-1

您可以封裝在哪裏和訂單方法是這樣的:

Model.where("user_id = ?", params[:id]).order("field_name DESC") 

我認爲這應該爲你做。我希望我能正確地理解它。

+0

不,不需要「'選擇user_id = <某個整數>'」。我只需要「'ORDER BY user_id = '」。 – Backo

1

你不能做一個ORDER BY user_id = <some_integer>。您只能通過列ASC或DESC進行訂購。有一些使用CASE關鍵字的高級案例。請閱讀mysql documentation

+0

'ORDER BY user_id = '子句似乎按預期工作:它「推進」檢索到的記錄與'user_id = '。你爲什麼說我不能那樣做? – Backo

+0

它實際上並沒有按照你的想法工作。我只是在自己的數據庫上運行'select * from clients ORDER BY id = 477',除了默認的mysql config order by子句外,它沒有任何其他命令。 MySQL不會以這種方式使用順序。你可以清楚地看到,如果你閱讀文檔。你想要做什麼?可能有另一種方法來做到這一點。 – Magicmarkker

+0

我讀了[這個問題](http:// stackoverflow。com/questions/13800333),爲了達到同樣的目的,我在「玩」...... – Backo

相關問題