Ruby on rails 3 不在RoR中的查询上
在Ruby on rails 3中,我想查询模型的多个字段,如下所示:Ruby on rails 3 不在RoR中的查询上,ruby-on-rails-3,Ruby On Rails 3,在Ruby on rails 3中,我想查询模型的多个字段,如下所示: @project.items.where(:status=>1) 问题是我试图得到与此完全相反的结果。我想要的是@project中状态为而不是1的所有项目。有人一直在寻找这个问题的答案吗?有很多方法可以完成你想做的事情,但是,有些方法比其他方法更好。如果您总是在搜索硬编码号码(即本例中的1),则以下解决方案将起作用: @project.items.where('status != 1') 但是,如果这个值不是硬编码的,您就
@project.items.where(:status=>1)
问题是我试图得到与此完全相反的结果。我想要的是
@project
中状态为而不是1的所有项目。有人一直在寻找这个问题的答案吗?有很多方法可以完成你想做的事情,但是,有些方法比其他方法更好。如果您总是在搜索硬编码号码(即本例中的1),则以下解决方案将起作用:
@project.items.where('status != 1')
但是,如果这个值不是硬编码的,您就容易受到SQL注入的攻击,因为Rails不会(不能)逃避这种查询。因此,Rails开发人员倾向于对大多数自定义条件(无法通过散列
构建的条件)使用以下语法:
这个语法有点让人困惑,所以让我来复习一下。基本上,您提供的是where
子句,它是一个Array
值。数组中的第一个值是表示要执行的查询的字符串。在该字符串中需要值的任何位置,都可以放置一个?
。这用作占位符。接下来,为查询中的每个问号添加一个元素。例如,如果我有以下内容:
where(['first_name = ? AND last_name = ?', params[:first_name], params[:last_name]]
Rails会自动将这些匹配起来,形成查询。在这个过程中,它还可以逃逸潜在的不安全字符,从而阻止注入
通常,最好使用数组语法,即使对于硬编码的值也是如此。有人告诉我,Rails 3.5中的纯字符串条件会发出警告(未经验证),因此现在就开始使用数组语法并没有什么坏处。@nayish-我完全重写了我的答案,以便为您提供更好的解释
where(['first_name = ? AND last_name = ?', params[:first_name], params[:last_name]]