2011-06-13 156 views
3

我是相当新的,并且在Rails中搜索数据库。我有一个模型和数据库,其中包含'name'属性下的名称列表。我希望能够将搜索关键字输入到单个搜索字段中,并且此输入可以是一个字或两个字或更多,具体取决于用户需要的结果的具体情况。在单个搜索文本字段(RAILS)中搜索多个关键字

现在,我正在使用下面显示的一些丑陋的东西,最多可以搜索3个搜索词。有没有办法使'search_length'关键字具有这种动态性? find方法显然是重复性的,但我不确定如何实现自动化,并且没有在其他地方发现任何有用的建议。

def self.search(search) 

    if search 
    search_length = search.split.length 
    find(:all, :conditions => ['name LIKE ? AND name LIKE ? AND name LIKE ?', 
    "%#{search.split[0]}%", "%#{search.split[1]}%", 
    "%#{search.split[search_length1]}%"]) 
    else 
    find(:all) 
    end 
end 

除此之外,爱好Rails迄今。

谢谢了, 利

回答

2

使用这样的事情:

find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}" }) 

我看起来很奇怪,但是,首先生成search_length倍串的名字怎么样?':

['name LIKE ?'] * search_length 

那么你有一些键的阵列,所以让我们加入所有的'AND':

["name LIKE ? ", "name LIKE ? ", "name LIKE ? "].join(' AND ') 

并最终与另一个数组合并。

+0

谢谢我会玩弄。 – Lev 2011-06-13 23:10:31

+0

我想我有第一部分,我们创造了正确数量的'名字像?'连接。最后一部分仍然很腥,我必须指定符合条件的关键字。我应该在那里传递一个数组吗? – Lev 2011-06-13 23:53:26

+0

此代码似乎适用于1个关键字,但分解更多。如果输入两个搜索条件,则会出现“错误的绑定变量数”错误。 – Lev 2011-06-14 00:29:24

0
formatted_columns = format_column_names(Sub.column_names) 
where(formatted_columns.map {|cn| "#{cn} like ?" }.join("or "), *(["%#{search}%"] * formatted_columns.size)) 

这需要照顾的所有列的还有场

7

如果关闭名称变量与其他%兆头卢卡斯斯利瓦代码的伟大工程的正确的金额。

完整的代码从上面为我工作。好帖子。

def self.search(search) 

    if search 
    search_length = search.split.length 
    find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}%" }) 
    else 
    find(:all) 
    end 

end 
+0

工作完美。谢谢你,先生! – 2013-07-08 22:35:06