0

我正在尝试做的事情:我有一个模型“Recipe”,在其中我定义了一个“search”方法,该方法从复选框(我称之为标签)中获取一组字符串和一个字符串。这个想法是在数据库中搜索包含字符串的“名称”或“指令”中包含任何内容的食谱,并且还具有与它的“标签”属性匹配的任何标签。

问题:搜索方法返回我数据库中的所有食谱,并且在通过特定参数查找时似乎根本不起作用。

控制器中的动作方法:

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

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

4

2 回答 2

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
于 2013-02-12T13:59:09.487 回答
0

当你这样做

search.present? do
  ...
end

该块的内容被忽略 - 将一个块传递给一个不需要的函数是完全合法的,但是除非函数决定调用该块,否则该块不会被调用。结果,您的条件构建代码都不会被执行。你可能是说

if search.present?
  ...
end

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

于 2013-02-12T14:09:11.657 回答