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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

Q&A

解決済

2回答

4731閲覧

Railsのorderメソッドやwhereメソッドについて質問です。

anpnt

総合スコア29

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

0グッド

0クリップ

投稿2019/01/16 06:10

Railsのorderメソッドやwhereメソッドなどのデータを扱うメソッドについて質問です。

純粋な疑問なんですが、

orderメソッド
http://railsdoc.com/references/order

whereメソッド
http://railsdoc.com/references/where

こちらの2つを見てみると、引数の渡し方が何パターンかあります。
Page.where("category_id = '1'")

このようにダブルクォーテーションで囲んで、数字だけシングルクォーテーションで囲んでたり、
ハッシュのようになっていたりするのはどういう意味なんでしょうか?

orderメソッドについても("created_at DESC")のような直感的ではない引数の渡し方などがあったり、これらのメソッドが内部でどういう処理をしているのかを少し教えていただきたいんですが、

細かい教え方ではなくてもSQLを走らせるためのメソッドをRubyで書くにはこうする必要がある、などの回答でも大丈夫なので、詳しい方ぜひ教えていただけませんか?

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

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

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

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

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

guest

回答2

0

order での 文字列指定とシンボル指定の差についての情報を示します。
研究してみてください。

symbol で渡した場合と文字列で渡したときは、跛行される SQL にすこし差があります。

  • ActiveRecord::QueryMethods order

https://apidock.com/rails/ActiveRecord/QueryMethods/order

...
User.order(:name)
=> SELECT "users".* FROM "users" ORDER BY "users"."name" ASC

User.order('name')
=> SELECT "users".* FROM "users" ORDER BY name
...

シンボル指定した場合、 SQL には name でなく users.name となります。
join や merge でこの差が効いてきます。

  • Rails Quick Tips - ActiveRecord Ordering

https://hashrocket.com/blog/posts/rails-quick-tips-activerecord-ordering

...

See the difference? When the symbol is passed, the query is built using fully qualified and properly quoted column names.
Most of the time your query will run fine but this does matter!
The issue comes up when you start joining tables or merging queries.
Without the column being fully qualified with the table name, your query may produce an ambiguous match.
This occurs when your joined tables have columns with the same name.

...

join したときの order 指定をシンボルで行う例が以下にあります。

  • Rails order by association field

https://stackoverflow.com/questions/19616611/

...
User.includes(:user_extension).order("user_extensions.company desc")
...
User.joins(:user_extension).merge(UserExtension.order(company: :desc))
...

文字列では order("user_extensions.company desc") とする必要がありますが、
シンボルでは order(company: :desc) とできます。

投稿2019/02/11 00:58

katoy

総合スコア22324

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

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

anpnt

2019/02/11 01:00

おおお、丁寧にありがとうございます!
guest

0

ベストアンサー

ActiveRecordは最終的にSQLを発行します。

 orderメソッドについても("created_at DESC")のような直感的ではない引数の渡し方

この場合はSQLそのままなので、逆に直感的と言えます。
SQLが先であり、Rubyが先ではないのです。

Page.where("category_id = '1'")

これはSQLのWHERE文そのままですから、これも非常に分かりやすいですね。
ただ、SQLインジェクションが入り込む余地があるので、

Page.where("category_id = ?", 1)または、Page.where(category_id: 1)とするべきでしょう。

いろいろな書き方をサポートする事で、柔軟にSQLを表現できるようになっています。

余裕があれば、Railsを学習しながらSQL単体での学習をおすすめします。
データベースを扱う以上、SQLをきちんと知っておいたほうが応用力がつきます。

投稿2019/01/16 06:40

mingos

総合スコア4025

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

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

anpnt

2019/01/19 13:02

なるほど、たしかにSQL単体で学習したほうがよさそうですね。 とてもわかりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問