【问题标题】:Can't quote array - rails sql不能引用数组 - rails sql
【发布时间】:2017-11-02 15:34:59
【问题描述】:

我正在尝试使用以下语法动态创建 sql 查询:

Company.joins(:founder_persons)
       .where("people.first_name like people[:first_name]", {people: {first_name: 'm%'}})

但是在 Rails 控制台上运行它会给我TypeError: can't quote Array。我猜这不是我们使用 where 字符串的方式?解决此错误的正确方法是什么?谢谢。

【问题讨论】:

    标签: sql ruby-on-rails ruby


    【解决方案1】:

    发生此错误的一个原因是嵌套数组用作 SQL 值。

    例子:

    Article.where(author: ['Jane', 'Bob'])
    

    有效,但是:

    Article.where(author: ['Jane', ['Bob']])
    

    会报错。快速解决方法是在阵列上运行 flatten

    (提及这一点是因为在搜索令人困惑的错误“无法引用数组”时出现此页面。)

    【讨论】:

    • 就是这样。你这个男人。
    【解决方案2】:

    你可以绑定任何值然后赋值,这样它们的数字应该一致,比如:

    Model.joins(:join_table)
         .where('models.first_attribute LIKE ? AND models.second_attribute LIKE ?', value_for_first_attr, value_for_second_attr)
    

    如果使用数组,您应该访问要比较的每个索引,或者您可以在 splat * 之前指定一个值,例如:

    Model.joins(:join_table)
         .where('models.first_attribute LIKE ? AND models.second_attribute LIKE ?', *array_of_values)
    

    请注意,虽然您通过这种方式传递“整个”数组,但它的大小或数量也应该一致,否则它会引发 ActiveRecord::PreparedStatementInvalid 错误,具体取决于元素是否比需要的多或少。

    【讨论】:

    • oooo yaas,让我试试 xD
    • 我想知道是不是你的意思,因为'm%'我不确定。
    • 哦,是的,这有一个问题,实际上查询是动态进行的,所以字符串可以是'this like ? AND this like ? AND this like ?,所以我可以在字符串后面传递一个值数组而不是逗号分隔值喜欢.where(...string... , [people[:first_name], people[:last_name]...])
    • 是的,如果值不止一个,你可以用同样的方式绑定值,注意你不需要使用数组,只需将它们用逗号分隔传递,它们必须重合。
    • 这就是问题所在,我不能通过逗号分隔它们。我有一个包含所有值的数组。例如,我有这个字符串:this like ? AND that like ?' 我有一个包含 2 个值的数组,其中 2 个名为 val_arr?。那我怎么.where('this like ? AND that like ?', comma_separated_each_element_of_val_arr) 呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多