【问题标题】:What does "~~ *" mean in Ruby?Ruby 中的“~~ *”是什么意思?
【发布时间】:2021-11-10 10:42:46
【问题描述】:

这部分代码用到了:

some_list.where("'#{@new_params[:email]}' ~~* name").any?

我尝试使用谷歌搜索,但我发现只有~ rxp 的描述,这对我来说同样不清楚(尤其是在示例中)。我之前没有使用过 Ruby,如果问题很愚蠢,请见谅。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql


    【解决方案1】:

    ~~* 实际上与 Ruby 没有任何关系。其Postgres specific ILIKE operator 用于模式匹配。

    此代码也是SQL injection vulnerability 的教科书示例。用户输入应该被参数化。

    some_list.where("? ~~* name", @new_params[:email]).any?
    

    这段代码也很奇怪,因为它有一个Yoda condition。通常你会写成:

    some_list.where("name ~~* ?", @new_params[:email]).any?
    

    【讨论】:

    • 如果你更喜欢命名参数而不是位置参数,你可以使用some_list.where(":name ~~* name", name: @new_params[:email]).any?
    • 现在我明白了,谢谢!是的,我认为使用命名参数和没有 Yoda 风格会更好。
    • 无论这段代码来自何处,都应该受到高度怀疑。如果它是您接管的项目,则应安装 brakeman 并进行安全审核。
    【解决方案2】:

    这与红宝石无关。您构造一个 sql 查询并将其传递给 #where 方法,因此它是一个 PostgreSQL 运算符。

    操作符~~相当于LIKE,~~*相当于ILIKE。还有 !~~ 和 !~~* 运算符分别代表 NOT LIKE 和 NOT ILIKE。所有这些运算符都是 PostgreSQL 特定的。

    这就是你传递给它的内容:

    "foo@bar.com ILIKE name"

    【讨论】:

      【解决方案3】:

      where 子句中的任何字符串都将被放入 SQL 查询中,然后将其传递给数据库。所以 ~~* 语法不是 ruby​​,而是 SQL。我的猜测是,您将 Postgres 用作数据库,因为:

      操作符~~相当于LIKE,~~*相当于ILIKE。还有 !~~ 和 !~~* 运算符分别代表 NOT LIKE 和 NOT ILIKE。所有这些运算符都是 PostgreSQL 特定的。

      取自:https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE

      【讨论】:

      • 是的,你是对的。现在我明白了,谢谢!
      猜你喜欢
      • 2011-04-18
      • 2016-08-17
      • 2016-09-17
      • 2011-01-11
      • 2011-10-14
      • 2014-06-21
      • 2010-09-18
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多