【问题标题】:Sequel adds single quotes to .whereSequel 将单引号添加到 .where
【发布时间】:2015-03-23 03:47:10
【问题描述】:

我正在使用带有 Sinatra API 和 Postgres 的 Sequel。我有一个名为“结果”的基本数据集:

results = Receipt.order(Sequel.desc(:date))

我正在尝试使用来自 JSON 对象的哈希过滤它,如下所示:

filters = {item: 'mortgage',
           method: 'check'}

def get_filtered_results(results, filters)
    filters.each do |key, value|
        results = results.where('? = ?', key, value)
    end
    return results
end

这些 '.where' 生成的 sql 查询是:

SELECT * FROM "receipts" WHERE ('item' = 'mortgage') and ('method' = 'check') ORDER BY "date" DESC LIMIT 50 OFFSET 0;

'item' 和 'method' 周围的引号导致查询不返回任何结果 - 当我在没有引号的情况下手动运行它们时,它们会返回预期的记录。我尝试将过滤器作为哈希而不是准备好的语句传递,结果相同。有没有什么方法可以构造不带引号的查询?

编辑:当我在 pry 中构造语句时 - 所以

Receipt.order(Sequel.desc(:date)).where(:item => 'mortgage payment').where(:method => 'check')

我得到了预期的结果。

【问题讨论】:

    标签: ruby postgresql sequel


    【解决方案1】:

    问题是占位符中将被替换的值被视为字符串而不是字段名称。您必须在查询中插入哈希 key。但是,这会使查询容易受到攻击,因此最好创建一个允许的过滤器数组:

    filters = {item: 'mortgage',
               method: 'check'}
    
    def get_filtered_results(results, filters)
      allowed_filters = [:item, :method]
    
      filters.slice(*allowed_filters).each do |key, value|
        results = results.where("#{key} = ?", value)
      end
      return results
    end
    

    slice() 方法将创建一个仅包含 allowed_filters 数组中的键的新哈希。

    【讨论】:

    • 谢谢!由于这不是 rails,我无法使用“切片”方法,但我将其与纯红宝石版本结合使用:stackoverflow.com/a/21816435/2203829
    • 哦,抱歉,我没有注意到 slice 是 Rails 方法,但很高兴你解决了 :)
    猜你喜欢
    • 2013-03-09
    • 2020-09-24
    • 2020-03-02
    • 2021-10-17
    • 1970-01-01
    • 2023-04-09
    • 2013-11-01
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多