rails ransack gem to search json column



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

我的 JSON 列如下所示

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

1、电话 2、3、4 应该是可搜索的。

参见 Ransack wiki

对于每个 JSON 列,

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

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

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

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

对于 Rails 4.2+ (Arel 6.0+):

  • model_name : 员工
  • column_name:extra_details(JSON 类型)
  • 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
  • 搜索洗劫都有效。搜索将在 Ransack 的下一个主要版本中被弃用。

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

洗劫维基。

博客/教程。

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

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

#search 将要使用的洗劫机的哈希值与您正在使用的谓词一起添加(例如 phone1_contphone1_eq

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

最新更新