【问题标题】:OR operators and Ruby where clauseOR 运算符和 Ruby where 子句
【发布时间】:2011-09-21 13:31:56
【问题描述】:

可能真的很容易,但我很难在网上找到有关此的文档 我在 Ruby 中有两个 activerecord 查询,我想通过 OR 运算符将它们连接在一起

@pro = Project.where(:manager_user_id => current_user.id )
@proa = Project.where(:account_manager => current_user.id)

我是 ruby​​ 新手,但我自己尝试过使用 ||

@pro = Project.where(:manager_user_id => current_user.id || :account_manager => current_user.id)

这没有用,所以 1. 我想知道如何在 Ruby 中实际执行此操作,以及 2. 如果那个人也可以在像这样的 ruby​​ 语句中给我一个关于布尔语法的提示。 例如与、或、异或……

【问题讨论】:

标签: ruby ruby-on-rails-3 activerecord


【解决方案1】:

在这种情况下,您不能使用 Hash 语法。

Project.where("manager_user_id = ? OR account_manager = ?", current_user.id, current_user.id)

【讨论】:

  • 那么在Arel/ActiveRecord中除了构建一个Sql字符串之外就没有办法表达OR条件了吗?
  • 这是 Arel/ActiveRecord。您不是在构建 SQL 字符串。 SQL 字符串为SELECT * FROM table WHERE ...
【解决方案2】:

您也应该查看 API 文档并遵守约定。在这种情况下,您可能会发送到 where 方法的代码。

这应该可行:

@projects = Project.where("manager_user_id = '#{current_user.id}' or account_manager_id = '#{current_user.id}'")

这应该是安全的,因为我假设 current_user 的 id 值来自您自己的应用程序,而不是来自外部来源,例如表单提交。如果您正在使用您打算在查询中使用的表单提交数据,您应该使用占位符,以便 Rails 创建正确转义的 SQL。

# with placeholders
@projects = Project.where(["manager_user_id = ? or account_manager_id = ?", some_value_from_form1, some_value_from_form_2])

当您将多个参数传递给 where 方法(带有占位符的示例)时,Rails 会将第一个参数视为 SQL 的模板。数组中的剩余元素将在运行时替换为您在第一个元素(即模板)中使用的占位符 (?) 的数量。

【讨论】:

    【解决方案3】:

    Metawhere 可以做 OR 运算,以及许多其他漂亮的东西。

    【讨论】:

    • Metawhere 为这种简单的查询增加了太多的开销。
    • 取决于您可能还想在哪里使用它。
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2013-10-04
    相关资源
    最近更新 更多