Rails - 用2个字段查找?

AnA*_*ice 50 ruby-on-rails ruby-on-rails-3

我在控制器中有以下内容

def update
    @permission = Permission.find_by_user_id(params[:user_id])
Run Code Online (Sandbox Code Playgroud)

但我希望它也可以通过另一个参数找到, project_id

我如何在Rails中做这样的事情?

@permission = Permission.find_by_user_id_and_project_id(params[:user_id],params[:user_id])
Run Code Online (Sandbox Code Playgroud)

Jes*_*ott 65

是的,您可以通过多种方式进行查找.

您的示例适用于:

@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]])
Run Code Online (Sandbox Code Playgroud)

在Rails 3中,你可以很酷:

@permission = Permission.where(:user_id=>params[:user_id]).where(:project_id=>params[:project_id]).first
Run Code Online (Sandbox Code Playgroud)


Fre*_*ore 64

Rails 4引入了find_by方法:

Permission.find_by(user_id: params[:user_id], project_id: params[:project_id])
Run Code Online (Sandbox Code Playgroud)

  • 它不容易被注入 - 你唯一一次有SQL注入的危险就是当你将一个提交的param直接插入到一个用于查询的字符串中时 - 比如`ModelName.where("attribute ='#{params [:属性]}'")`.在某些情况下,您需要使用ActiveRecord查询构建器无法创建的自定义查询,但在这些情况下,您可以使用以下语法:`ModelName.where("attribute =?",params [:attribute])` (4认同)