【发布时间】:2013-09-10 15:27:10
【问题描述】:
我的问题类似于this one,但那里的答案都没有解决我的具体问题。
我想找到这样的对象:
conditions = {first_name: @search OR last_name: @search}
Stuff.where( conditions )
显然,这种语法是无效的,但它是我能想到的最简单的方法来展示我想要做什么。我想在复杂/复合条件下使用更简洁的哈希语法。
我知道你可以用像这样的“纯字符串条件”Stuff.where("first_name=#{@search} OR last_name=#{@search}") ...但这不是我想知道的。
更新看起来您可以对这样的数组执行 OR:Stuff.where( some_column: ["option1", "option2"])。知道这一点非常有用,但它并不能解决我的问题,因为我需要 OR 来应用于不同的键=值对...key=value OR key=value 而不是key=value OR value。
Update2 我不想使用 SQL 字符串的原因是因为我需要分几部分构建查询,但我不知道如何做到这一点,同时仍然逃避插入的变量。我还没有测试过,但我假设这不起作用:
conditions = ["(project_id=? AND sent_to_api=1)", @project_id]
conditions = conditions + ["first_name=? OR last_name=?", @search, @search]
Stuff.where( conditions )
希望这是有道理的。有没有办法用 SQL 字符串语法做我需要的,同时仍然保留 Rails 的内置 SQL 转义?
【问题讨论】:
-
如果唯一的方法是将条件写成字符串,如
Stuff.where(["first_name = ? OR last_name = ?", @search]),你想知道吗? -
这有很好的记录,所以谢谢,但没有。 (我知道我的稻草人示例不是最佳的)
-
查看Squeel gem 以获得更简洁的 ActiveRecord 语法。
-
更新的方法实际上并没有生成
OR,它使用IN ()...通常被SQL引擎解释为OR,但我想指出这一点以便澄清.
标签: ruby-on-rails ruby ruby-on-rails-4 sql-injection