重构复杂的动态活动关系查询

时间:2011-05-13 06:02:23

标签: ruby-on-rails ruby activerecord refactoring

我想知道是否可以获得一些重构帮助以使这个查询更简洁。

此查询的基本操作是它通过某些搜索词搜索所有help_documents。它会检查文档问题,内容及其所属的类别。

  def self.search(text)
    if text.blank?
      latest
    else
      relation = sorted.joins(:category)

      text.split(/\s/).each do |word|
        relation = relation.where(
            "lower(help_documents.question) like ? or lower(help_documents.content) like ? or lower(help_categories.name) like ?",
            "%#{word.downcase}%", "%#{word.downcase}%", "%#{word.downcase}%"
        )
      end

      relation
    end
  end

与在java / hibernate中执行此操作相比,这实际上看起来非常好。但我认为铁杆人们甚至可能有更性感的伎俩来完成同样的事情。例如,可能有一些我不知道的方法/对象已经做了这些类型的事情。

1 个答案:

答案 0 :(得分:2)

我首先要删除所有的小写和小写调用。如果您使用的是mysql并且您的表是utf8,那么类似的将不区分大小写。这应该消除一些噪音,以便我们可以更多地看待问题。

此外,您可以在where:

中使用命名键
relation.where("help_documents.question like :term, or help_documents.content like :term, or help_categories.name like :term", {:term => "%#{word}%"})

另外,你可能想看看squeel(http://metautonomo.us/projects/squeel/),它可以让你更进一步,并为你提供大量的语法糖。