133

私はそのようなクエリを実行しようとしています

def self.search(search, page = 1 )
  paginate :per_page => 5, :page => page,
    :conditions => ["name LIKE '%?%' OR postal_code like '%?%'", search, search],   order => 'name'
end

しかし、それが実行されると、何かが引用符を追加しているため、SQLステートメントが次のように表示されます

SELECT COUNT(*)
FROM "schools" 
WHERE (name LIKE '%'havard'%' OR postal_code like '%'havard'%')):

だからあなたは私の問題を見ることができます。私はRails 4とPostgres 9を使用していますが、どちらも使用したことがないので、それがactiverecordのものなのか、おそらくpostgresのものなのかわかりません。

これをどのように設定すれば'%my_search%'、最後のクエリに好きなようにできますか?

4

7 に答える 7

243

プレースホルダーが文字列に置き換えられ、正しく処理されていません。

交換

"name LIKE '%?%' OR postal_code LIKE '%?%'", search, search

"name LIKE ? OR postal_code LIKE ?", "%#{search}%", "%#{search}%"
于 2013-09-30T23:57:17.843 に答える
52

conditionsRails 2の構文を使用する代わりに、 Rails 4 のwhereメソッドを使用します。

def self.search(search, page = 1 )
  wildcard_search = "%#{search}%"

  where("name ILIKE :search OR postal_code LIKE :search", search: wildcard_search)
    .page(page)
    .per_page(5)
end

注: 上記では、? の代わりにパラメーター構文を使用しています。プレースホルダー: これらは両方とも同じ sql を生成する必要があります。

def self.search(search, page = 1 )
  wildcard_search = "%#{search}%"

  where("name ILIKE ? OR postal_code LIKE ?", wildcard_search, wildcard_search)
    .page(page)
    .per_page(5)
end

注:ILIKE名前に使用 - postgres の大文字と小文字を区別しないバージョンの LIKE

于 2013-10-01T00:07:59.607 に答える
25

文字列補間は機能しますが、質問で Rails 4 が指定されているため、これに Arel を使用し、アプリ データベースに依存しないようにすることができます。

def self.search(query, page=1)
  query = "%#{query}%"
  name_match = arel_table[:name].matches(query)
  postal_match = arel_table[:postal_code].matches(query)
  where(name_match.or(postal_match)).page(page).per_page(5)
end
于 2013-12-15T01:59:18.673 に答える
5

試す

 def self.search(search, page = 1 )
    paginate :per_page => 5, :page => page,
      :conditions => ["name LIKE  ? OR postal_code like ?", "%#{search}%","%#{search}%"],   order => 'name'
  end

詳細については、AREL 条件に関するドキュメントを参照してください

于 2013-09-30T23:57:49.400 に答える
-1
.find(:all, where: "value LIKE product_%", params: { limit: 20, page: 1 })
于 2016-12-28T08:14:07.750 に答える