0

検索条件を作ろうとしているのですが、困っています。

これは私が作成しようとしている方法です。

def self.searchadv(title, place, category, date)
    !title.blank? ? conditions = ['title LIKE ?', "%#{title}%"] : conditions = []
    if conditions
        !place.blank? ? conditions << [' AND place LIKE ?', "%#{place}%"] :  conditions << []
        !place.blank? ? conditions << [' AND category LIKE ?', "%#{place}%"] :  conditions << []
        !place.blank? ? conditions << [' AND date LIKE ?', "%#{place}%"] :  conditions << []
    else 
        !place.blank? ? conditions << [' place LIKE ?', "%#{place}%"] :  conditions << []
        !place.blank? ? conditions << [' category LIKE ?', "%#{place}%"] :  conditions << []
        !place.blank? ? conditions << [' date LIKE ?', "%#{place}%"] :  conditions << []
    end
    find(:all, :conditions => conditions)
end

place パラメータを追加しようとすると、このエラーが発生するまでうまくいきます

バインド変数の数が間違っています (1 に対して 4): title LIKE ?

これを削除すると:

if conditions
    !place.blank? ? conditions << [' AND place LIKE ?', "%#{place}%"] :  conditions << []
    !place.blank? ? conditions << [' AND category LIKE ?', "%#{place}%"] :  conditions << []
    !place.blank? ? conditions << [' AND date LIKE ?', "%#{place}%"] :  conditions << []
else 
    !place.blank? ? conditions << [' place LIKE ?', "%#{place}%"] :  conditions << []
    !place.blank? ? conditions << [' category LIKE ?', "%#{place}%"] :  conditions << []
    !place.blank? ? conditions << [' date LIKE ?', "%#{place}%"] :  conditions << []
end

すべてがうまく機能しますが、検索を作成するにはこの他のオプションが必要であり、エラーが「LiKE」にある理由がわかりません

誰でも私を助けてくれますか?

前もって感謝します!

4

2 に答える 2

0

私は最初にあなたのコードを保持しようとして、それを修正しようとしただけでしたが、多くの悪いことがありました:)これがあなたが使用しているのと同じ構造を維持してそれをどのようにしたかです(しかしおそらく条件ハッシュを使用する方が良いです@Deefourの提案のように):

def self.searchadv(title, place, category, date)
  cond_ary = []
  cond_values = []
  unless title.blank?
    cond_ary << 'title LIKE ?'
    cond_values << "%#{title}%"
  end
  unless place.blank?
    cond_ary << 'place LIKE ? AND category LIKE ? AND date LIKE ?'
    cond_values.push("%#{place}%", "%#{place}%", "%#{place}%")
  end
  conditions = [ cond_ary.join(' AND ') ] + cond_values
  find(:all, :conditions => conditions)
end

条件配列がどのように見えるかを調べてから、ルビーコンソールで配列を試してみることをお勧めします。たとえば、、、などの配列で何が起こるかをary << 1確認ary << [1,2,3]ary.concat([1,2,3])ますary.push(1,2,3)

そして、あなたがするとき

expr ? x = 1 : x = 2

使用する方が良いです

x = expr ? 1 : 2
于 2012-12-03T00:12:19.480 に答える
0

これは非常に見苦しく、読み取り/デバッグが難しく、エラーが発生しやすい

def self.searchadv(title, place, category, date)
  conditions              = {}
  conditions[:title]      = "%#{title}%" if title.present?

  if place.present?
    conditions[:place]    = "%#{place}%"
    conditions[:category] = "%#{category}%"
    conditions[:date]     = "%#{date}%"
  end

  where(conditions)
end

編集OPが指摘したように、上記ではワイルドカードの一致は許可されていません。以下は、ARel のmatches方法を使用してこれを実現します。

def self.searchadv(title, place, category, date)
  offers     = self.arel_table
  predicates = []

  predicates << offers[:title].matches("%#{title}%") if title.present?

  if place.present?
    predicates << offers[:place].matches("%#{place}%")
    predicates << offers[:category].matches("%#{category}%")
    predicates << offers[:date].matches("%#{date}%")
  end

  if predicates.size > 1
    first = predicates.shift
    conditions = Arel::Nodes::Grouping.new(predicates.inject(first) {|memo, expr| Arel::Nodes::And.new(memo, expr)})
  else
    conditions = predicates.first
  end

  where(conditions).to_a
end
于 2012-12-02T22:44:43.383 に答える