0

私がやろうとしていること:チェックボックス (タグと呼びます) から文字列の配列を取得するメソッド「検索」と単一の文字列を定義したモデル「レシピ」があります。アイデアは、文字列を含む「名前」または「指示」に何かがあり、かつ「タグ」プロパティに一致するタグのいずれかも含むレシピをデータベースで検索することです。

問題:検索メソッドはデータベース内のすべてのレシピを返しますが、特定のパラメーターによる検索ではまったく機能していないようです。

コントローラーのアクション メソッド:

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

レール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 に答える