我有一个字段作为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_cont
或 phone1_eq
)
因此,要使上述工作,您必须致电Model.search({phone1_cont: "555"})