【问题标题】:Convert sql to ActiveRecord scope将 sql 转换为 ActiveRecord 范围
【发布时间】:2017-09-19 06:23:42
【问题描述】:

我有以下sql:

select * from slide_results where tags @> ARRAY['pro']::varchar[] 

我将其转换为 ActiveRecord 范围:

scope :by_tags, ->(tags) { where('tags @> ?', "{ARRAY[pro]::varchar[]}") }

但不幸的是它没有返回相同的结果? 我做错了什么?

【问题讨论】:

    标签: sql ruby-on-rails postgresql activerecord


    【解决方案1】:

    你有你的ARRAY[...] 并且投错了地方,你有一些杂散的括号;此外,类型转换不应该是必需的。你应该说:

    where('tags @> array[?]', 'pro')
    

    否则,ActiveRecord 会将 {ARRAY[pro]::varchar[]} 视为单个字符串,应将其转义并用单引号括起来,从而产生:

    tags @> '{ARRAY[pro]::varchar[]}'
    

    因为'{ARRAY[pro]::varchar[]}' 不能满足您的要求,它只是一个 SQL 字符串文字。

    如果数组的内容总是'pro' 那么你可以直接去:

    where("tags @> array['pro']")
    

    因为占位符并不是真正需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      相关资源
      最近更新 更多