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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

1001閲覧

配列、find_by_sqlで.firstなどを指定しなければならない理由を教えてください

seen

総合スコア49

SQL

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/10/30 09:01

先日こちらのサイトで、find_by_sqlでのデータの取得について質問したところ
お陰様で「.first」を付けることで解決する事ができました。
その後理解を深めたく勉強中なのですが.firstの必要性がまだ理解できないので私の考え方の誤りをご指摘いただきたく思います。

以下、同じEventモデルのeventsレコードからいずれもid1のid番号を出力させるコードでして

class EventsController < ApplicationController def show @event = Event.find(1) @event1 = Event.find_by_sql(           ['select * from events where id = ?', 1]           ) end show.html.rb <p><%= @event.id %></p> <p><%= @event1.first.id %></p> #ブラウザにされるのは 1 1

もしくは

class EventsController < ApplicationController def show @event = Event.find(1) @event1 = Event.find_by_sql(           ['select * from events where id = ?', 1]           ).first #←ここに.first end show.html.rb <p><%= @event.id %></p> <p><%= @event1.id %></p> #ブラウザにされるのは 1 1

これで意図していることは解決できましたが、
疑問なのは

@event1 = Event.find_by_sql(           ['select * from events where id = ?', 1]           )

ここですでに[id1のレコード]と絞り込めているのになぜ.firstを指定しなければいけないのでしょうか。 という質問なんです。
自身で考えたこととして
(['select * from events where id = ?', 1])ではid1のeventsレコードに絞り込めたわけではない? だとするとこのコードは何を意味するのか。
または配列でfindした場合はたとえ一つに絞り込めていても.firstなどをつけないといけない?
といったところで理解しきれていないです。

本来はidがわかっている検索は@event = Event.find(1)でいいと思うのですが別件で導入したい事の参考サイトのなかで find_by_sql が出てきましてどうしても理解したいです。 [参考サイト] (https://qiita.com/SasakiYasai/items/b1352b3e46824b3844db)
初歩的かもしれませんがどうぞよろしくお願いします。

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

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

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

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

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

guest

回答2

0

1件しか返ってこなかった場合、1件しか返ってこないことを目的としたSQLなのか、複数件返ってくることもあるけどたまたま1件しか返ってこないSQLなのかプログラムからはわかりません。
ですので、1件しかない場合も配列で返すという仕様になっています。

投稿2017/10/30 09:26

chelsy7110

総合スコア596

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

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

seen

2017/10/30 10:30

ありがとうございます! 帰ってくるのが一件であっても配列で検索している場合はfirstなどで特定しないといけないのですね。。 理解が固まりました。ありがとうございます!
guest

0

ベストアンサー

こんにちは。私の考え--間違っているかもしれませんが--
idは、すべてのレコードで別なので、1個に絞り込めるのですが、find_by_sql自体は、それを想定してない、つまり、2個以上のレコードが該当することも想定してある--と思います。

ということは、1個目のレコード(first)であると明記しないとまずいだろうと思います。

私が見ている本には以下のように、2個以上、該当することを想定して、戻り値を受け取る変数は、複数を示す"s"がついています。

@books = Book.find_by_sqr(以下略)

ここに、1個のオブジェクトしか入らないわけです。

投稿2017/10/30 09:30

nekoyama7

総合スコア200

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

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

seen

2017/10/30 10:27

ありがとうございます! 変数はたしかに複数形ですね。 そもそも複数を前提としていて配列で検索した場合は必ずfirstなりlastなり指定しなければコンピュータはレコードを特定できないのですね。  ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問