Ransack 与数组值完全匹配
Ransack exact match with array values
我必须使用 ransack 对数据库执行搜索。数据库中的一些列将数据存储在序列化数组中。我想将存储在数组中的确切数据与用户发送的数据进行匹配以执行搜索(用户的数据也是数组)。例如,在数据库中,一列的数据为(c1
,c2
是测试用例):
c1.column_data = [1, 2, 3, 4, 5]
c2.column_data = []
用户搜索数据(t1
、t2
、t3
为测试用例):
t1.user_data = [1]
t2.user_data = [1, 3]
t3.user_data = [1, 2, 3, 4, 5]
t4.user_data = []
- 对于
c1
和 t1
、t2
、t4
的情况,它应该 return no match found
.
- 使用
t3
,结果应该是 match found
。
- 对于
c2
和 t1
、t2
、t3
的情况,它应该 return no match found
.
- 与
t4
匹配,它 return 找到匹配项。
我找到了 postgres_ext gem,但我无法让它工作。任何人都可以建议我如何做到这一点或建议任何替代方法来进行这样的搜索吗?也欢迎任何替代解决方案。
好的,使用 rails 5.1 简单的 Ransack 搜索就可以正常工作。例如,假设您的具有序列化数组名称的列之一是 'column_data'
t.text :column_data, array: true, default: []
您可以按照以下语法搜索数组列:
‘{ val1, val2, … }’
例如在控制台中
some_search = Model.search(column_data_eq: '{1,3}')
some_search.result
应该会给你以下结果
SELECT "model".* FROM "mdole" WHERE "model"."column_data" = '{1,3}' LIMIT [["LIMIT", 11]]
我正在回答我自己的问题。
可能会因要求而异。
如果有任何确切的数据匹配,我必须获取用户参数并在数据库中搜索,然后将用户放在同一组中,否则使用搜索到的数据创建一个新组,最后还为各个用户保存每个搜索到的数据.
由于所有字段都是多个 select 下拉复选框等所有参数都以字符串数组的形式出现。
我的问题解决方法:
1. 对数组参数进行排序并用逗号连接起来并生成字符串。
例如:
a = [1,2,3,4,5,6]
a.sort.join(',')
"1,2,3,4,5,6"
我将这个字符串存储在文本的数据库列中。
不,当用户搜索一个组时,我获取它的参数并以逗号分隔的字符串再次转换它并使用 where 子句查询数据库完成。
在UI中,我再次将此字符串转换为数组并显示给用户。
我不知道这样做是否正确,但它对我有用。
仍然欢迎任何好的解决方案。
我必须使用 ransack 对数据库执行搜索。数据库中的一些列将数据存储在序列化数组中。我想将存储在数组中的确切数据与用户发送的数据进行匹配以执行搜索(用户的数据也是数组)。例如,在数据库中,一列的数据为(c1
,c2
是测试用例):
c1.column_data = [1, 2, 3, 4, 5]
c2.column_data = []
用户搜索数据(t1
、t2
、t3
为测试用例):
t1.user_data = [1]
t2.user_data = [1, 3]
t3.user_data = [1, 2, 3, 4, 5]
t4.user_data = []
- 对于
c1
和t1
、t2
、t4
的情况,它应该 returnno match found
. - 使用
t3
,结果应该是match found
。 - 对于
c2
和t1
、t2
、t3
的情况,它应该 returnno match found
. - 与
t4
匹配,它 return 找到匹配项。
我找到了 postgres_ext gem,但我无法让它工作。任何人都可以建议我如何做到这一点或建议任何替代方法来进行这样的搜索吗?也欢迎任何替代解决方案。
好的,使用 rails 5.1 简单的 Ransack 搜索就可以正常工作。例如,假设您的具有序列化数组名称的列之一是 'column_data'
t.text :column_data, array: true, default: []
您可以按照以下语法搜索数组列:
‘{ val1, val2, … }’
例如在控制台中
some_search = Model.search(column_data_eq: '{1,3}')
some_search.result
应该会给你以下结果
SELECT "model".* FROM "mdole" WHERE "model"."column_data" = '{1,3}' LIMIT [["LIMIT", 11]]
我正在回答我自己的问题。
可能会因要求而异。
如果有任何确切的数据匹配,我必须获取用户参数并在数据库中搜索,然后将用户放在同一组中,否则使用搜索到的数据创建一个新组,最后还为各个用户保存每个搜索到的数据.
由于所有字段都是多个 select 下拉复选框等所有参数都以字符串数组的形式出现。
我的问题解决方法: 1. 对数组参数进行排序并用逗号连接起来并生成字符串。 例如:
a = [1,2,3,4,5,6]
a.sort.join(',')
"1,2,3,4,5,6"
我将这个字符串存储在文本的数据库列中。 不,当用户搜索一个组时,我获取它的参数并以逗号分隔的字符串再次转换它并使用 where 子句查询数据库完成。
在UI中,我再次将此字符串转换为数组并显示给用户。
我不知道这样做是否正确,但它对我有用。
仍然欢迎任何好的解决方案。