質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2940閲覧

whereメソッドの第一引数の`LOWER(column)`がわからない

begenner

総合スコア79

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/01/14 05:45

編集2019/01/14 07:54

現在RSpecの勉強として

を参考に勉強していますが、下記のコードの意味がわかりません(m_ _m)
内容としては
Noteモデルに、渡された文字列でメモ(note)を検索する機能を付与する為のスコープ
だそうです。

わかる方がいらっしゃれば教えていただきますようお願いいたします(m_ _m)

また、今後もRailsは使っていきたいので、

  • アウトプットは別で行っている
  • ネットでググっておすすめされているものを見てみる

-> 本屋で目次と中身をさらっと見ているが同じに見えてくるので買っていない

  • 「プロを目指す人のためのRuby入門」は少しずつ触っている

という状態なので

  • ProgateTutorialの次に勉強するなら何がおすすめか(書籍、サイトなど)

教えていただければとても嬉しいです()。
中でも複数の書籍を勉強してみた方の意見はとても参考になります。
※ 恐れ入りますがggrks はなしでお願いいたします(m_ _m)

###動作環境
OS:mac
Ruby:2.4.5
Ruby on Rails: 5.1.6.1

###該当のソースコード(Noteモデルに、渡された文字列でメモ(note)を検索する機能を付与する為のスコープ)
app/model/note.rb

ruby

1#app/model/note.rb 2scope :search, ->(term) { 3 # ↓`LOWER(message)`がわからない <- メソッドのように見えるが調べてもわからない 4 where("LOWER(message) LIKE ?", "%#{term.downcase}%") 5}

db/schema.rb

ruby

1#db/schema.rb 2 create_table "notes", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| 3 t.text "message" 4 t.bigint "project_id" 5 t.bigint "user_id" 6 t.datetime "created_at", null: false 7 t.datetime "updated_at", null: false 8 t.string "attachment_file_name" 9 t.string "attachment_content_type" 10 t.bigint "attachment_file_size" 11 t.datetime "attachment_updated_at" 12 t.index ["project_id"], name: "index_notes_on_project_id" 13 t.index ["user_id"], name: "index_notes_on_user_id" 14 end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「Everyday Rails - RSpecによるRailsテスト入門」の翻訳者、および「プロを目指す人のためのRuby入門」著者の伊藤です。
訳書、著書のご購入ありがとうございます。

さて、「LOWER(message)がわからない」とのことですが、LOWERは「引数の文字列をすべて小文字にするSQLの関数」です。

参考 SQLite Query Language: Core Functions

つまり、ここではnotesテーブルのmessageカラムに保存されている値をすべて小文字に変換しています。

なお、where("LOWER(message) LIKE ?", "%#{term.downcase}%")全体をかみ砕いて説明すると、

「スコープの引数として与えられたterm文字列が含まれる、notesテーブルのmessageを大文字小文字を区別せずに検索する処理」

になります。
なぜならterm.downcaseで、スコープの引数として与えられたtermもすべて小文字に変換されるからです。

たとえばnotesテーブルに全部大文字の"I LEARNED RUBY ON RAILS PERFECTLY."というmessage文字列が格納され、termに大文字と小文字が混在した"Ruby on Rails"が渡されたとしても、両方小文字として扱われるので、この場合は検索結果として抽出されることになります。

なお、後半の教材の件については、話が変わるのでここでは回答を控えます。
(個人的には1つの質問に複数の質問を混在させるよりも、それぞれ独立した質問にした方が良いと思います。)

投稿2019/01/14 06:45

jnchito

総合スコア357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

begenner

2019/01/14 07:04 編集

著者の方にご回答いただけるとは思っていませんでした!! ありがとうございます!! これがSQLの関数だとは全然気づきませんでした。 教えていただいたことを元に調べてみると LOWER(message) のLOWERを小文字で書かれている記事が散見していますが、 どちらでもいいということでしょうか?
jnchito

2019/01/14 07:09

SQL関数は大文字小文字を区別しないことが多いです。(`LOWER`でも`lower`でも`Lower`でも動作する) ただ、このあたりの挙動はRDBMS(SQLite、PostgreSQL、MySQL、Oracle、etc)によって異なることがあるので、もしかすると大文字小文字を区別するRDBMSもあるかもしれません。
begenner

2019/01/14 07:35

非常に勉強になりました!! ゆっくりですが2冊とも進めていきたいと思います!! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問