Rails 3:搜索方法返回所有模型而不是指定

时间:2013-02-12 13:51:03

标签: ruby-on-rails search methods

我正在尝试做什么:我有一个模型“Recipe”,我在其中定义了一个方法“搜索”,它从复选框中获取一串字符串(我称之为标签),以及单个字符串。我们的想法是在数据库中搜索包含字符串的“名称”或“说明”中包含任何内容的食谱,并且还有任何与其“标记”属性匹配的标记。

问题:搜索方法返回我的数据库中的所有配方,并且在查找特定参数时似乎完全不起作用。

控制器中的操作方法:

def index
      @recipes = Recipe.search(params[:search], params[:tag])
      if !@recipes
        @recipes = Recipe.all
      end
      respond_to do |format|
      format.html 
      format.json { render json: @recipe }
    end
  end

我模型中的搜索方法:

  def self.search(search, tags)
    conditions = ""

    search.present? do
        # Condition 1: recipe.name OR instruction same as search?
        conditions = "name LIKE ? OR instructions LIKE ?, '%#{search[0].strip}%', '%#{search[0].strip}%'"

     # Condition 2: if tags included, any matching?
      if !tags.empty?
        tags.each do |tag|
          conditions += "'AND tags LIKE ?', '%#{tag}%'"
        end
      end
      end
    # Hämtar och returnerar alla recipes där codition 1 och/eller 2 stämmer.
        Recipe.find(:all, :conditions => [conditions]) unless conditions.length < 1
  end

为什么它会返回所有记录的任何想法?

2 个答案:

答案 0 :(得分:0)

如果你使用rails 3,那么很容易找到条件

def self.search(string, tags)
  klass = scoped

  if string.present?
    klass = klass.where('name LIKE ? OR instructions LIKE ?', "%#{string}%", "%#{string}%")
  end

  if tags.present?
    tags.each do |tag|
      klass = klass.where('tags LIKE ?', "%#{tag}%")
    end
  end

  klass
end

答案 1 :(得分:0)

当你这样做时

search.present? do
  ...
end

忽略该块的内容 - 将块传递给不期望的块的函数是完全合法的,但是除非函数决定,否则不会调用块。因此,您的条件构建代码都不会被执行。你可能意味着

if search.present?
  ...
end

正如jvnill指出的那样,操作范围通常比手工构建SQL片段更好(和更安全)