2

次のクエリは、id(主キー)で検索しません。idに0を割り当て、nameにsearch_strを割り当て続けます。「id」の一致の代わりにequals演算子を使用すると、適切に実行されます。次のスコープに問題がありますか?

scope :or_search, lambda {|name| where(arel_table[:name].matches("%{search_str}%").or(arel_table[:id].matches("%#{search_str}%")))
4

3 に答える 3

1

まず第一に、スコープ定義の最後にある閉じ中括弧を1つ見逃したと思われるタイプミスをしました

答えに来て、私はあなたが一致IDまたはタイトルのいずれかであると思いますか?

ブロックへのパラメーターは「名前」であるため、「search_str」はどこからも来ていないことに注意してください。したがって、比較したいテーブルの属性と比較できます:)

そして、あなたの問題に対して私が考えることができる答えは

スコープ :or_search, ラムダ {|タイトル| where(arel_table[:title].matches("%#{title}%").or(arel_table[:id].matches("#{title}")))} パレ

于 2013-02-08T13:28:32.593 に答える
1

私はあなたが何をしようとしているのか少し混乱していますが、最初に

arel_table[:name].matches("%{search_str}%")

が欠けています。#これはあるべきだと思います

arel_table[:name].matches("%#{search_str}%")

次に、これを見ただけで、引数をどこにも使用していないので、?nameに置き換えたいと思うかもしれません。search_strname

于 2013-02-06T01:41:32.510 に答える
1

うまくいかない理由を理解しようとしているだけなのか、それとも実用的な解決策を探しているのかわかりません。

とにかく、以下は arel にはありませんが、モデルに追加すると機能します:

def self.or_search(str)
  where("name like :input OR id like :input", input: "%#{str}%")
end
于 2013-02-11T13:01:05.223 に答える