在Ruby on rails 3中,我想查询模型的has_many字段,如下所示:
@project.items.where(:status => 1)
问题是我试图得到与此完全相反的结果。我想要的是@project
的所有项目状态不 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语法的过程并没有什么坏处。