2010-10-14 61 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