1

我的 html 代码中有 5 个选择。我将它们发送到控制器,但例如它们中的一些可能是空的(默认值为 0),所以例如在某些情况下,我只需要通过params[:size] 某些情况下仅通过params[:capacity]和其他params[:size] and params[:capacity]两种情况进行搜索...但是如何这样做?如何使用 find 等操作?现在我有这样的事情:

size = "*"+params[:akbsize]+"*"
    @accums = Accumulator.find(:all, :conditions => ["MATCH(description) AGAINST (? in boolean mode)", size])
    cap = "*"+params[:akbcapacity]+"*"
    @accums2 = Accumulator.find(:all, :conditions => ["MATCH(description) AGAINST (? in boolean mode)", cap])

但是如何按照我的描述做呢?在这里使用元搜索 gem 好用吗?

4

3 回答 3

1

你可以像这样为它制作方法:

class Accumulator
  def self.by_size(size)
    if size
      where("description LIKE ?", "%#{size}%")
    else
      scoped
    end
  end

  def self.by_capacity(capacity)
    if capacity
      where("description LIKE ?", "%#{capacity}%")
    else
      scoped
    end
  end
end

然后在您的控制器上:

@accums = Accumulator.by_size(params[:size]).by_capacity(params[:capacity])

这将完成你想要的。我认为这种方法根本就没有必要。

=)

于 2012-11-09T00:59:47.633 回答
0
sterms = [params[:a],params[:b],params[:c]].select {|t| t}.join('%')
results = Accumulator.where("description like ?", "%#{sterms}%")

或者你可以像这样使用布尔搜索

sterms = [params[:a],params[:b],params[:c]].select {|t| t}.map {|t| '+' + t}.join(' ')
results = Accumulator.where("MATCH(description) AGAINST( ? in boolean mode) ", sterms)

或者,如果您正在搜索描述,其中任何参数传递的搜索词都会生成匹配项,您可以这样做:

sterms = [params[:a],params[:b],params[:c]].select {|t| t}.join(' ')
results = Accumulator.where("MATCH(description) AGAINST( ? in boolean mode) ", sterms)

这些假设参数根本不存在,即零。如果有一个特定的值要用来表示空,更改.select,即

sterms = [params[:a],params[:b],params[:c]].select {|t| t != "0"}.join('%')

如您所见,我可以继续使用搜索逻辑的各种排列和组合,这就是为什么我建议寻找某种元搜索 gem。

于 2012-11-08T21:52:07.273 回答
0

您可以查看Ransack gem,它或多或少地解决了创建复杂搜索表单的问题。

于 2012-11-08T22:28:53.323 回答