次のクエリは、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}%")))
次のクエリは、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}%")))
まず第一に、スコープ定義の最後にある閉じ中括弧を1つ見逃したと思われるタイプミスをしました
答えに来て、私はあなたが一致IDまたはタイトルのいずれかであると思いますか?
ブロックへのパラメーターは「名前」であるため、「search_str」はどこからも来ていないことに注意してください。したがって、比較したいテーブルの属性と比較できます:)
そして、あなたの問題に対して私が考えることができる答えは
スコープ :or_search, ラムダ {|タイトル| where(arel_table[:title].matches("%#{title}%").or(arel_table[:id].matches("#{title}")))} パレ
私はあなたが何をしようとしているのか少し混乱していますが、最初に
arel_table[:name].matches("%{search_str}%")
が欠けています。#
これはあるべきだと思います
arel_table[:name].matches("%#{search_str}%")
次に、これを見ただけで、引数をどこにも使用していないので、?name
に置き換えたいと思うかもしれません。search_str
name
うまくいかない理由を理解しようとしているだけなのか、それとも実用的な解決策を探しているのかわかりません。
とにかく、以下は arel にはありませんが、モデルに追加すると機能します:
def self.or_search(str)
where("name like :input OR id like :input", input: "%#{str}%")
end