Rails在db中搜索不同的字段

时间:2012-11-07 21:46:06

标签: mysql ruby-on-rails ruby activerecord

我的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])

但是我怎么做?在这里用元搜索宝石做好事吗?

2 个答案:

答案 0 :(得分: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])

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

=)

答案 1 :(得分: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)

这些假设只是没有params,即nil。如果您想使用特定值表示空,请更改.select,即

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

正如您所看到的,我可以继续使用搜索逻辑的各种排列和组合,这就是为什么我建议找到某种形式的元搜索宝石。