rails ransack gem搜索json列

时间:2016-07-09 02:57:59

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

我有一个字段作为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应该是可搜索的。

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_contphone1_eq

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

答案 3 :(得分:0)

对于Rails 4.2+(Arel 6.0 +):

  • model_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
  • 搜索随身听 search will be deprecated在Ransack的下一个主要版本中。

  • ->不能正常工作。 ->>有效。

Ransack Wiki.

Blog/tutorial.