【问题标题】:rails activerecord 'where' search through arrayrails activerecord 'where' 搜索数组
【发布时间】:2015-08-02 08:24:57
【问题描述】:

您好,我的搜索查询有问题,有 3 个值(val1、val2、标签),其中一个是数组(标签)。我知道 rails 不支持数组,但 Postgres 支持,而且我已经安装了它。

我有一个示范动作:

  def self.find_object(val1, val2, tags)
    if tags.blank?
      Object.where( val1: val1, val2: val2 ).to_a
    else
      Object.where( "val1 = ? and val2 = ? and tags = [?]", val1, val2, tags).to_a
    end
  end

但我得到一个错误:

PG::SyntaxError: 错误: "[" LINE 1 处或附近的语法错误: ...HERE (val1 = 'Ziemia' and val2 = '1' and tags = ['Jadeit']... ^ : SELECT "objects".* FROM "objects" WHERE (val1 = 'Ziemia' and val2 = '1' and tags = ['Jadeit'])

我的问题是我不知道如何处理数组搜索。在我的测试应用程序中,像这样的代码 >> Student.where("hobby && ARRAY[?]", hobby) 其中 hobby 是一个数组有效,所以这是我在这个示例中的开始。我会很高兴任何提示如何处理这个:)

编辑:添加错误信息

【问题讨论】:

  • 我认为这个tags = [?] 应该是tags IN (?)
  • 不,现在我收到错误ERROR: array value must start with "{" or dimension
  • 你的tags是数组格式吗?
  • 是的t.text :tags, array: true, default: []

标签: ruby-on-rails postgresql activerecord


【解决方案1】:

在 PostgreSQL 中创建数组有两种语法:

  • ARRAY[1,2,3]
  • '{1,2,3}'

所以其中任何一个都可以:

Object.where( "val1 = ? and val2 = ? and tags = ARRAY[?]", val1, val2, tags).to_a
# or
Object.where( "val1 = ? and val2 = ? and tags = '{?}'", val1, val2, tags).to_a

但是请注意,当使用'{}' 语法时,PostgreSQL 期望字符串使用双引号(而不是通常的单引号),因此将这种语法与字符串数组和 ActiveRecord 一起使用将失败。我建议您始终使用永远不会失败的ARRAY[] 语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 2014-10-15
    • 2012-09-16
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多