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

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

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

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

Q&A

解決済

1回答

536閲覧

SQLリクエストの発行タイミングについて

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2018/10/18 03:41

一部検索条件を動的に変えたい場合

@users = User.where(year: params[:year]) if params[:gender].present? @users = @users.where(gender: params[:gender]) end

というようにかくとSQLリクエストは2回発行されてしまいますか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

今後のためにも自分で確認する、調べる方法を確立したほうが良いと思いますので、答えは書きません。
調べる方法だけ回答します。
development環境で、bin/rails consoleでコードを書けば、
発行されるSQLも確認できますので、やってみてください。

consoleでつまづくと思われる点だけ補足すると、
consoleは改行した時点で命令が発行されるので、試す場合はメソッドにしたほうが良いです。

具体的には、こんな感じのメソッドをエディタで書いて、bin/rails consoleが起動したら、貼り付けて、
その後に、test(year: 2018, gender: 'male')を実行するという事です。

ruby

1def test(params) 2 @users = User.where(year: params[:year]) 3 if params[:gender].present? 4 @users = @users.where(gender: params[:gender]) 5 end 6 @users 7end

投稿2018/10/18 03:45

編集2018/10/18 03:52
mingos

総合スコア4025

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

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

退会済みユーザー

退会済みユーザー

2018/10/18 04:26 編集

# rails console のあと改行するとヘルプみたいなのがでて 改行せずにはりつけると syntax error がでます console のあと r オプションでスクリプトファイルとして実行できますか?
mingos

2018/10/18 04:31 編集

少なくとも、rails consoleを起動して、 上記testメソッドをそのままコピー&ペーストすると、syntax errorは起きません。 手元で確認済みです。 貼り付ける時は、エディタにコードを書いてそれ全体をコピーして、まとめてconsoleに貼り付けてください。
退会済みユーザー

退会済みユーザー

2018/10/18 04:30

起動というのがよくわからないのですが ターミナルにまず > rails console[returnキー] をしてしまうのですか? それとも rails console のあとに開業せずにいまのコードをはりつけるのですか? そのどちらもうまくいかなかったので…
mingos

2018/10/18 04:33

rails consoleといえば、ターミナルでbin/rails console[エンター]と打ちます。 Loading development environment (Rails 5.2.1) >> という形でconsoleが起動しますよね。 これがrails consoleを実行するという意味だし、それ以外の行動は指しません。
mingos

2018/10/18 04:36 編集

この >> のところに、私が書いたtestメソッド全体を貼り付けます。 一度、テキストエディタのほうにtestメソッド全体(def test~end)を張り付けて、CTRL+Aで全体を選択し、クリップボードにコピーしてください。 その後、consoleのほうに戻って貼り付ければうまく行くはずです。 そのまま貼り付けると、こういう感じに表示されます。 Loading development environment (Rails 5.2.1) >> def test(params) >> @users = User.where(year: params[:year]) >> if params[:gender].present? >> @users = @users.where(gender: params[:gender]) >> end >> @users >> end => :test この後、このようにtestメソッドを呼び出します。 >> test(gender: 'male', year: 2018) [エンター]
退会済みユーザー

退会済みユーザー

2018/10/18 04:38 編集

うーん… 起動しないです ちなみに /bin/rails というパスがなかったので単に rails コマンドのことかと思ったんですが違うんでしょうか > rails console[returnキー] ``` root@docker_rails:~# rails console Usage: rails new APP_PATH [options] : ``` というヘルプメッセージがでてそのまま bash に戻ります ちなみに rails 4.2.3 で which rails は /usr/local/rbenv/shims/rails になってました
mingos

2018/10/18 04:39

そもそもどこで実行しているのか?という話なのですが・・・。 常識的に考えて、railsプロジェクト直下にいる前提なのは分かると思うのですが。 cd railsプロジェクト ls -l bin/ とやったらrailsコマンドはありますか?
退会済みユーザー

退会済みユーザー

2018/10/18 04:50

すいません プロジェクトディレクトリに移動したら起動しました コマンドをうつ場所も関係あるのですね… 動きました 太文字で色ついてるのがSQL文なんですね これいつもコンソールに出てたんですけどエラーが出たときしかみたことなかったです 結論から言うと1回しか発行されなかったです そうなると疑問なのが発行タイミングになるんですが def test(params) @users1 = PUser.all if params[:gender].present? @users2 = @users1.where(gender: params[:gender]) end puts @users1 puts @users2 end こうかくと当然ですが2回発行されます コンパイラはどこで変数の中身をリレーションから実際のデータにセットしてるんでしょうか
mingos

2018/10/18 04:51

はい、そうですね。1回となります。 そしてSQLが発行されるのは、allとかeachを実行したタイミングとなります。
退会済みユーザー

退会済みユーザー

2018/10/18 04:57

puts @users2 も中身は実データになってたんですけどどういうことなんでしょうか puts の中で配列の場合に each がよばれてるんでしょうか 深く考えてもよくわからないですが とりあえずリレーション同士は分割してもコンパイラが必要最小限のリクエストにしてくれるってことなんですね 長々とありがとうございました
mingos

2018/10/18 05:00

私も全部は把握していませんが、whereなどは、ActiveRecord::Relationというオブジェクトが戻り値で、これはまだSQLを組み立てる段階のもので、SQLは発行されません。 RailsがSQLを発行するべきと判断したところで、発行されるという理解です。 具体的なその全てのパターンは分からないけども、consoleを使って検証できるという事だけでも覚えていれば応用できる範囲が広がると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問