[解決済み] 姓と名で検索してみる
質問
railsアプリでユーザーを姓と名の両方で検索しようとしているのですが、現在試している各方法で結果がまちまちです。これらのメソッドのいずれかを書き換えて、希望する結果を得る方法はありますか?
user_controller.rb
メソッド #1
def self.search(query)
where("first_name LIKE ? OR last_name LIKE ?", "%#{query}%", "%#{query}%")
end
これは姓か名のどちらかで動作しますが、両方は動作しません。
方法その2
def self.search(keywords)
if keywords
where(:all, :conditions => ["concat(first_name," ",last_name) like?", "%#{keywords}%"])
end
end
これは結果を返しません
メソッド#3
def self.search(search)
if search
select('(first_name || " " || last_name) as \'ful_name\', *')
where ['first_name LIKE :s OR last_name LIKE :s OR ful_name LIKE :s', :s => "%#{search}"]
else
scoped
end
end
これはエラーを返します
SQLite3::SQLException: no such column: ful_name: SELECT "users".* FROM "users" WHERE (first_name LIKE '%Spider Man' OR last_name LIKE '%Spider Man' OR ful_name LIKE '%Spider Man') ORDER BY created_at DESC
app/views/users/index.html.erb:5:in `_app_views_users_index_html_erb__848623016_40254132'
index.html.erb
<% provide(:title, 'Search') %>
<h1>Search</h1>
<ul class="span4 users">
<%= render @users %>
</ul>
_user.html.erb
<li>
<%= image_tag user.avatar(:medium) %>
<h4><%= link_to user.full_name, feed_user_path(user), :class => "follow-color" %></h4>
<% if current_user.admin? && !current_user?(user) %>
| <%= link_to "delete", user, method: :delete,
data: { confirm: "You sure?" } %>
<% end %>
</li>
_header.html.erb
<%= form_tag users_path, method: "get", class: "search-bar" do %>
<%= text_field_tag :search, params[:search], placeholder: "Search" %>
<% end %>
解決方法は?
これです。
:conditions => ["concat(first_name," ",last_name) like?", "%#{keywords}%"]
が動作しないのは、(陰湿な)引用符の問題があるからです。Rubyでは、こうです。
"a" "b"
と同じです。
"ab"
だからあなたの
:conditions
は本当はこうです。
:conditions => ["concat(first_name,,last_name) like?", "%#{keywords}%"]
ということですね。
:conditions => ["concat(first_name, ' ', last_name) like ?", "%#{keywords}%"]
SQLの文字列リテラルは、二重引用符ではなく一重引用符を使用します。また、標準SQLをサポートすると謳っているデータベースを使用している場合、SQLの文字列リテラルを記述する際に
||
演算子で文字列の連結を行います。
:conditions => ["first_name || ' ' || last_name like ?", "%#{keywords}%"]
SELECT句で定義されたエイリアスは一般にWHERE句では使用できないため、3番目のものは動作しません。したがって、 "unknown column" というエラーが発生します。の結果も捨ててしまうことになります。
select
の呼び出しが足りないので
.
ここでも
select('(first_name || " " || last_name) as \'ful_name\', *')
where ['first_name LIKE :s OR last_name LIKE :s OR ful_name LIKE :s', :s => "%#{search}"]
SQLでは文字列リテラルはシングルクォートを使い、ダブルクォートは識別子のために使われます。とだけ言いたいのでしょう。
where("first_name like :s or last_name like :s or first_name || ' ' || last_name like :s", :s => "%#{search}")
または単に
where("first_name || ' ' || last_name like :s", :s => "%#{search}")
2つほど注意点があります。
-
文字列の連結演算子は、データベース固有のものです。標準的なSQLでは
||
を使用したいが、設定によってはMySQLがconcat
関数を使用します。AFAIKは、SQLiteが多くのMySQLイズムをサポートしていますが、それらを使用する際には注意が必要で、できるだけ標準に忠実であるべきです。 - クウォートは、これもまたデータベース固有のものです。標準SQLでは、文字列リテラルには一重引用符を、識別子(テーブル名やカラム名など)には二重引用符を使用します。MySQLは識別子にバックチックを使用し、SQLiteは(AFAIK)識別子にダブルクォートまたはバックチック、文字列にシングルクォートまたはダブルクォートを使用することができます。繰り返しになりますが、良い習慣を身につけるために、できるだけ標準に忠実でありたいものです。
関連
-
[解決済み] pg gem をインストールしようとすると 'libpq-fe.h' ヘッダが見つからない
-
[解決済み] heroku open - no app specified
-
[解決済み] heroku push rejected, failed to compile Ruby/rails app
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] gemのアップデート後、"Asset was not declared to be precompiled in production "でテストが失敗する。
-
[解決済み] Railsでグループとカウント
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] rake db:migrate db:reset とdb:schema:loadの違いについて
-
[解決済み】RailsでActiveRecordモデルとそのテーブルの名前を変更するマイグレーションはどのように記述するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】修正方法:エラー:'<ファイル名>'にチェックアウトされたコミットがない fatal: コマンドプロンプトで "git add ." を入力するとファイルの追加に失敗する
-
[解決済み】Rails。Ruby on Railsの移行でデータベースカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Rubyで変数をインクリメントする [重複]。
-
[解決済み] Herokuの問題 : あなたが探しているページは存在しません。
-
[解決済み] RoRにおけるSpringサーバーの機能とは?
-
[解決済み] Rails / Haml: 投稿フォームを作成するには?
-
[解決済み] Rspec が私のモデルクラスを認識しない。初期化されていない定数エラー
-
[解決済み] Heroku: 既存のrailsアプリにseeds.rbをプッシュする方法?
-
[解決済み] Railsでグループとカウント
-
[解決済み] RSpecとCucumberの違いは何ですか?[クローズド]