2010-10-14 62 views
37

我有一個控制器Rails - 通過2個字段查找?

def update 
    @permission = Permission.find_by_user_id(params[:user_id]) 

但我希望它也被另一個PARAM發現以下,project_id

我怎麼可以做這樣的事情在Rails的?

@permission = Permission.find_by_user_id_and_project_id(params[:user_id],params[:user_id]) 

回答

61

是的,你可以做的發現在一堆的方式。下面

你的榜樣工程:

@permission = Permission.find_by_user_id_and_project_id(params[:user_id],params[:project_id])

- 注意你的榜樣有了兩個user_ids

在Rails 2.x中,您還可以使用條件

@permission = Permission.find(:conditions=>["user_id=? and project_id=?", params[:user_id], params[:project_id]]) 

而且在Rails的3,你可以像酷似:

@permission = Permission.where(:user_id=>params[:user_id]).where(:project_id=>params[:project_id]).first 
+0

謝謝,我喜歡的第一個一個雖然...更清潔。 – AnApprentice 2010-10-14 19:25:44

+0

最後一個是導軌3的方式...除非放入一個範圍。 – DGM 2010-10-14 19:28:05

+1

在這裏同意DGM,範圍很大.... Permission.for(@user).for(@project).first對於代碼可讀性很有幫助 – 2010-10-15 16:44:30

4

試試這個:

@permission = Permission.find(:conditions => ['user_id = ? and project_id = ?', params[:user_id], params[:project_id]]) 
4

Rails 3的方式與範圍:

scope :by_user_id_and_project_id, lambda {|user_id,project_id| 
    where(:user_id=>user_id).where(:project_id=>project_id]) 
} 

然後你就可以使用它像:

@permission = Permission.by_user_id_and_project_id(params[:user_id],params[:project_id]) 
40

的Rails 4引入了find_by方法:

Permission.find_by(user_id: params[:user_id], project_id: params[:project_id]) 
+0

此語法是否容易受SQL注入影響? – csi 2015-09-09 17:36:31

+1

我也想知道這一點。當使用params [:attribute]並且不是時,這有點令人困惑。 – Augusto 2016-06-04 21:52:32

+3

它不容易被注入 - 唯一一次你有SQL注入的危險是當你提交的參數直接插入到一個字符串中,用於查詢 - 比如'ModelName.where(「attribute ='#{params [ :屬性]}'「)'。在某些情況下,您需要使用ActiveRecord查詢構建器無法創建的自定義查詢,但在這種情況下,您可以使用以下語法:'ModelName.where(「attribute =?」,params [:attribute])' – 2016-06-05 22:55:36