我有一个字段作为json列,我必须搜索该列内的所有电话值,我已搜索它,我没有找到任何使用ransack的文件。是否可以使用ransaack搜索json列? 我已经使用搜索来搜索其他字段,所以我必须使用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应该是可搜索的。
答案 0 :(得分:5)
请参阅Ransack wiki
对于每个JSON列,将其中一个添加到您的模型中,它将使您的JSON列能够像普通列一样被删除:
ransacker :phone1 do |parent|
Arel::Nodes::InfixOperation.new('->', parent.table[:json_column], 'phone1')
end
答案 1 :(得分:1)
有一个名为properties
的json列的表,您应该能够告诉ransack
使用以下代码段查看phone1内部:
ransacker :phone1 do
Arel.sql("table.properties ->> 'phone1'")
end
答案 2 :(得分:0)
上述答案是正确的,但如果您仅为最后一个arg发送一个字符串,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"})
答案 3 :(得分:0)
对于Rails 4.2+(Arel 6.0 +):
# 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
搜索和随身听。 search will be deprecated在Ransack的下一个主要版本中。
->
不能正常工作。 ->>
有效。