【问题标题】:How do I do a where query on a SQL column against multiple values?如何针对多个值对 SQL 列执行 where 查询?
【发布时间】:2016-02-06 00:42:35
【问题描述】:

这是我的查询的样子:

Connection.where("invited_user_id = :user_a_id AND inviter_user_id = :user_b_id", user_a_id: self.inviter.try(:id), user_b_id: self.invited.try(:id)).exists?

我想做的基本上是检查invited_user_id 是否有多个选项,例如类似invited_user_id = [:user1, :user2]。但这不起作用。

如何检查invited_user_id 列中的值是否在变量:user1:user2 或任何其他多个变量中。

如果不使用不那么 DRY 的显式 OR 方法,这是否可能?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord arel


    【解决方案1】:

    永远不要将值直接放在查询中,这是不安全的。使用 ? 运算符参数化您的查询。

    invited_user_ids = [:user1, :user2]
    Connection.where("invited_user_id IN (?)", invited_user_ids)
    

    【讨论】:

    • 您能否更新此查询以在此查询中工作:Connection.where("invited_user_id = :user_a_id AND inviter_user_id = :user_b_id", user_a_id: self.inviter.try(:id), user_b_id: self.invited.try(:id)).exists?
    • 占位符条件与您建议的使用 ? 参数化相同。请参阅guides.rubyonrails.org/… - 第 2.2.1 节了解更多信息。
    【解决方案2】:

    where 的哈希形式接受值数组,所以:

    Connection.where(invited_user_id: [1, 2, 3, 4, 5])
    

    这将找到invited_user_id 是数组中列出的任何值的所有记录。

    【讨论】:

    • 在 SQL 中有什么方法可以做到这一点?
    • 是的,但这不是你的问题。 select * from table where invited_user_id IN (1, 2, 3, 4, 5)
    • 我的错。我的意思是,以这样的格式获取它:Connection.where("invited_user_id = :user_a_id AND inviter_user_id = :user_b_id", user_a_id: self.inviter.try(:id), user_b_id: self.invited.try(:id)).exists? 如何针对:user_a_id:user_b_id 查询每一列?
    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2020-04-30
    • 2011-03-15
    • 2010-09-13
    相关资源
    最近更新 更多