【问题标题】:rails ransack gem to search json columnrails ransack gem 搜索 json 列
【发布时间】:2016-07-09 02:57:58
【问题描述】:

我有一个字段作为 json 列,我必须搜索该列中的所有电话值,我已经搜索过它,但我没有使用 ransack 找到任何文档。是否可以使用 ransaack 搜索 json 列? 我已经使用 ransack 搜索其他字段,所以我必须使用 ransack 或可以结合这两个结果的东西

我的 json 列是这样的

{"phone1"=>"", "relationship_type1"=>"", "relationship_name1"=>"", "phone2"=>"", "relationship_type2"=>"", "relationship_name2"=>"", "phone3"=>"", "relationship_type3"=>"", "relationship_name3"=>"", "phone4"=>"", "relationship_type4"=>"", "relationship_name4"=>""}

phone1,phone2,3,4 应该是可搜索的。

【问题讨论】:

    标签: ruby ruby-on-rails-3 ruby-on-rails-4 ransack


    【解决方案1】:

    Ransack wiki

    对于每个 JSON 列,将其中一个添加到您的模型中,这将使您的 JSON 列能够像普通列一样被洗劫:

    ransacker :phone1 do |parent|
      Arel::Nodes::InfixOperation.new('->', parent.table[:json_column], 'phone1')
     end
    

    【讨论】:

      【解决方案2】:

      有一个带有名为properties 的json 列的表,您应该能够告诉ransack 使用以下sn-p 查看phone1 内部:

      ransacker :phone1 do
        Arel.sql("table.properties ->> 'phone1'")
      end
      

      【讨论】:

      • 您想通过添加一些解释来改进您的纯代码答案吗?
      • 虽然这段代码可以回答问题,但最好解释一下如何解决问题并提供代码供参考。纯代码答案的实用性很低,而且常常令人困惑。
      【解决方案3】:

      对于 Rails 4.2+(Arel 6.0+):

      • model_name:员工
      • column_name:extra_details(jsonb 类型)
      • json_key : 爱好
      # in models/employee.rb
      ransacker :hobbies do |parent|
        Arel::Nodes::InfixOperation.new('->>', parent.table[:extra_details], Arel::Nodes.build_quoted('hobbies'))
      end
      

      在控制台测试它:

      Employee.search({ "hobbies_cont" => "Reading" }).result
      # or
      Employee.ransack({ "hobbies_cont" => "Painting" }).result
      
      • searchransack 都有效。 搜索 will be deprecated 在 Ransack 的下一个主要版本中。

      • -> 无法按预期工作。 ->> 有效。

      Ransack Wiki.

      Blog/tutorial.

      【讨论】:

        【解决方案4】:

        上面的答案是正确的,除了如果你只为最后一个参数发送一个字符串,Arel 6+ 会引发异常,在这个例子中你必须使用Arel::Nodes::build_quoted('phone1') 而不是'phone1

        另外,我发现如果你要在模型上使用ransacker,你必须用Model.search而不是Model.ransack来调用它,这可能会有一些例外,但使用Model.search是有效的对我来说。

        #search 获取您将要使用的 ransacker 的哈希值以及您正在使用的谓词(例如 phone1_contphone1_eq

        因此,要完成上述工作,您必须致电 Model.search({phone1_cont: "555"})

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-13
          • 1970-01-01
          • 1970-01-01
          • 2014-10-14
          • 2021-12-29
          相关资源
          最近更新 更多