Ransack与数组值完全匹配

时间:2018-03-14 09:39:27

标签: ruby-on-rails ruby ransack

我必须使用ransack在数据库上执行搜索。数据库中的一些列将数据存储在序列化数组中。我想将存储在数组中的确切数据与用户发送的数据进行匹配以执行搜索(用户数据也是数组)。例如,在数据库中,一列的数据为(c1c2为测试用例):

c1.column_data = [1, 2, 3, 4, 5]
c2.column_data = []

用户搜索数据(t1t2t3是测试用例):

t1.user_data = [1]
t2.user_data = [1, 3]
t3.user_data = [1, 2, 3, 4, 5]
t4.user_data = []
  • 如果案例c1包含t1t2t4,则应返回no match found
  • 使用t3,结果应为match found
  • 如果案例c2包含t1t2t3,则应返回no match found
  • 使用t4,返回`匹配找到。

我找到了postgres_ext gem,但我无法让它发挥作用。任何人都可以建议我如何做到这一点或建议任何替代搜索方法这样的?任何替代解决方案也是受欢迎的。

2 个答案:

答案 0 :(得分:5)

我正在回答我自己的问题。

可能会有所不同。

我必须使用用户参数并在数据库中搜索是否有任何确切的数据匹配,然后将用户放在同一组中,否则使用搜索到的数据创建一个新组,并最后为各个用户保存每个搜索到的数据。 / p>

由于所有字段都是多选下拉列表复选框等,所有参数都以字符串数组形式出现。

我解决问题的方法: 1.对数组params进行排序,并用逗号和字符串连接起来。 例如:

    a = [1,2,3,4,5,6]
    a.sort.join(',')
    "1,2,3,4,5,6"

我将此字符串存储在文本的数据库列中。 否,当用户搜索组时,我会使用其参数并以逗号分隔的字符串再次转换它并使用where子句查询到数据库。

在UI中,我再次将此字符串转换为数组并将其显示给用户。

我不知道这样做的正确方法,但它对我有用。

仍然欢迎任何好的解决方案。

答案 1 :(得分:1)

好吧,使用rails 5.1简单的Ransack搜索就行了。例如,假设您的一个具有序列化数组名称的列是' column_data'

$(document).ready(function() {
  $(".tstInfo").on("click",function(){
       $.toast({
        heading: 'Welcome to my Elite admin',
        text: 'Use the predefined ones, or specify a custom position object.',
        position: 'top-right',
        loaderBg:'#ff6849',
        icon: 'info',
        hideAfter: 3000, 
        stack: 6
      });

 }); });

您可以按照以下语法搜索数组列:

t.text :column_data, array: true, default: []

例如在控制台

‘{ val1, val2, … }’

应该给你以下结果

some_search = Model.search(column_data_eq: '{1,3}')
some_search.result