不在RoR中的查询

时间:2011-01-23 03:01:43

标签: ruby-on-rails-3

在Ruby on rails 3中,我想查询模型的has_many字段,如下所示:

@project.items.where(:status => 1)

问题是我试图得到与此完全相反的结果。我想要的是@project的所有项目状态 1.一直在寻找答案,有人吗?

1 个答案:

答案 0 :(得分:3)

有很多方法可以完成你想要做的事情,但有些方法比其他方法更好。如果您始终正在搜索硬编码的数字(在本例中为1),则以下解决方案将起作用:

@project.items.where('status != 1')

但是,如果此值不是硬编码的,那么您将完全容易受到SQL注入攻击,因为Rails不会(不能)转义此类查询。因此,Rails开发人员最好为大多数自定义条件(那些无法通过Hash构建的条件)使用以下语法:

@project.items.where(['status != ?', 1])

这种语法有点令人困惑,所以让我来看看。基本上,您为where子句提供了Array个值。数组中的第一个值是String,表示要执行的查询。无论您想要该字符串中的值,都可以放置?。这是一个占位符。接下来,在查询中为每个问号添加一个元素。例如,如果我有以下内容:

where(['first_name = ? AND last_name = ?', params[:first_name], params[:last_name]]

Rails会自动匹配这些形成您的查询。在这个过程中,它也会逃避潜在的不安全角色,防止注射。

通常,最好使用Array语法,即使对于硬编码值也是如此。我被告知Rails 3.5中的纯字符串条件会引发警告(未经验证),因此现在使用Array语法的过程并没有什么坏处。