2013-02-08 25 views
1

我使用on Rails的3.2.11在Mac添加附加條件中的Rails 3 find_by_id

我有這樣的語句正常工作:

object= Object.find_by_id(params[:id])

我試圖加條件,所以我這樣做:

object = Object.where("id = :id AND level <= :level",{:id => params[:id], :level =>  current_user.level}) 

這種方法會有任何風險?任何替代品?

回答

1

只要ActiveRecord繼續堅持消毒輸入合同,本聲明就沒有風險。另一種選擇是一個範圍,但這實際上只是用不同的語法來做同樣的事情。

你可以做的一件事是set a default scope,它定義了level限制,那麼你可以做一個標準的find_by_id。但是,如果這是不可取的,只要使用正確的語法:

Object.where(id: params[:id], level: current_user.level) 
+0

它的工作原理。但是,當我使用它時,一些方法變得未定義。有什麼我做錯了嗎? –

+0

您的語法錯誤。檢查更新的答案。 –

0

是沒有風險的,但它的定義方式是不容易理解。

簡單的聲明將工作:

object = Object.where("id = ? AND level <= ?",{params[:id], current_user.level}) 
0

只要你讓鐵軌處理你的價值觀的消毒,你不會有任何問題。我的意思,這是運行使用用戶輸入軌SQL命令像

Object.where("id = #{params[:id]} AND level <= #{current_user.level}") 

將容易受到SQL注入

+0

它看起來像誰低估了我沒有得到我的意圖。我試圖說,上面的代碼易受sql注入的影響。 – 2013-02-08 08:42:28