2013-05-08 79 views
-1

我在mysql数据库的列letters中有以下数据。我将它们保存在varchar中:数据库中的字符串数组。匹配并返回值

letters 
["a","b"] 
["a","b","d"] 
["a","d"] 
["d","c","e"] 
["e","c","f"] 
["c","f"] 
["f","e"] 

我想匹配一些元素。当我有params[:lttrs]"a",我想回:

["a","b"] 
["a","b","d"] 
["a","d"] 

当我有params[:lttrs]"c,e",我想回:

["d","c","e"] 
["e","c","f"] 

我尝试检索所有行,然后相互匹配其中有include?('a'),但以此,我一次只能做一个元素。这是方法吗?

+1

当'params [:lttrs]'是“a,c,e”还是“b,d,e,f”会发生什么? – 2013-05-08 07:12:16

回答

0

您可以使用LIKE运算符进行通配符匹配。这个解决方案比使用ruby更快。但如果你有一个大桌子,它会很慢。如果您提供关于数据设计原因的更多详细信息,我们将能够提出其他方法。

like_params = params[:lttrs].split(",").map{|letter| "%#{letter}%"} 
like = like_params.map{ "LIKE ?"}.join(" OR ") 
Model.where(like, like_params) 
0

你可以尝试做这样的事情:

query = "letters " 
r = 1 
letters_arr = params[:lttrs].split(",") 
letters_arr.each do |l| 
    if r == 1: 
    query << " like '%#{l}%'" 
    else 
    query << " or like '%#{l}%'" 
    end 
end 

letters_found = WhateverModel.where(查询)

显然,你需要确保的是,在PARAMS比这更安全地处理,但这应该会让你走上正轨。

相关问题