Mysql Rails使用不同字段在db中搜索

Mysql Rails使用不同字段在db中搜索,mysql,ruby-on-rails,ruby,activerecord,Mysql,Ruby On Rails,Ruby,Activerecord,我的html代码中有5个select。我将它们发送到控制器,但例如,其中一些可能为空(默认值为0),因此,例如,在某些情况下,我只需要通过params[:size]进行搜索,而在另一些情况下,我只需要通过params[:capacity]进行搜索,在另一些情况下,params[:size]和params[:capacity]也可以进行搜索。。。但是你怎么做呢?如何操作find等? 现在我有这样的东西: size = "*"+params[:akbsize]+"*" @accums = A

我的html代码中有5个select。我将它们发送到控制器,但例如,其中一些可能为空(默认值为0),因此,例如,在某些情况下,我只需要通过
params[:size]
进行搜索,而在另一些情况下,我只需要通过
params[:capacity]
进行搜索,在另一些情况下,
params[:size]和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好吗

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)
这些假设参数只是不存在,即nil。如果要使用特定值来指示空,请更改.select,即

sterms = [params[:a],params[:b],params[:c]].select {|t| t != "0"}.join('%')
正如您所看到的,我可以继续使用搜索逻辑的各种排列和组合,这就是为什么我建议寻找某种元搜索宝石的原因

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

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)
这些假设参数只是不存在,即nil。如果要使用特定值来指示空,请更改.select,即

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

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

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

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

您可以这样为其创建方法:

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])
这将实现你想要的。我认为这种方法完全没有必要


=)

您可以这样为其创建方法:

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])
这将实现你想要的。我认为这种方法完全没有必要



=)

您使用的是什么版本的rails?@RadBrad 3.2.8,但有必要吗?很奇怪,您使用的是旧样式(:condition=>…),而不是新的AREL样式,即acculator.where(“MATCH(description)…”)。我问了,因为我想发布一个答案,但后来意识到最好是查看元搜索宝石。@RadBrad好的,请处理AREL的东西,并使用元搜索)@RadBrad那么你在哪里丢失了?你使用的是什么版本的rails?@RadBrad 3.2.8,但有必要吗?只是好奇,你使用的是旧样式(:condition=>…)与新的AREL产品不同,即Accumulator.where(“匹配(描述)…”)。我问了,因为我想发布一个答案,但后来意识到最好是查看元搜索宝石。@RadBrad好的,请处理AREL的东西,并使用元搜索)@RadBrad那么你在哪里丢失了?我没有像大小或容量这样的字段。。。我有描述。。。我必须搜索这个字段…嗯,是同一个兄弟,你只需要更改字段名。无论如何,我更新了我的答案以反映您的需求。=)我的错误,一切都很好,简单的chanhe字段:D:DDadded方法来建模。。。未定义的方法“按大小”为#嘿,请尝试。。。但是,然后获得未定义的方法“按大小”,也尝试添加到控制器。。。没有…我没有像大小或容量这样的字段。。。我有描述。。。我必须搜索这个字段…嗯,是同一个兄弟,你只需要更改字段名。无论如何,我更新了我的答案以反映您的需求。=)我的错误,一切都很好,简单的chanhe字段:D:DDadded方法来建模。。。未定义的方法“按大小”为#嘿,请尝试。。。但是,然后获得未定义的方法“按大小”,也尝试添加到控制器。。。没有什么。。。