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

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

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

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

Q&A

解決済

1回答

471閲覧

find_by_sqlでデータを取得できない

seen

総合スコア49

Ruby on Rails

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

0グッド

0クリップ

投稿2017/10/14 01:25

Stageモデルのstagesテーブルのレコードを取得して表示させようとしています。 
find_byで表示させることができ、同じ動作をさせようとしていますが上手くいかずエラーが出ます。 
find_by_sqlの使い方が良くないと思うのですが解決できません。
お力添えをいただきたくお願い申し上げます。
NoMethodError in Stages#index

Showing /vagrant/shinya/app/views/stages/index.html.erb where line #1 raised:

undefined method `title' for #Array:0xb98cd98
Extracted source (around line #1):
1

1 <p><%= @stages.title %></p>

ためしに

#コントローラー def index @stages = Stage.find_by(id: 6) end #ビュー <p><%= @stages.title %></p>

このようにするとid6のタイトルが表示されます。
find_by_sqlで同じ動作をさせようとこのようにすると

#コントローラー @stages = Stage.find_by_sql(['select * from stages where id = ?', 6]) #ビュー <p><%= @stages.title %></p>

このようにしても結果が同じだと思いやってみたところエラーになりました。

ちなみにStageレコードは現状このid6だけです。
エラーの原因をご指摘いただけますと助かります。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

find_by_sqlで実行した場合配列で返ってきます。
実行したSQLが1件しか返ってこないのはプログラムからは分からないので複数返ってくる形になります。
ですので、.firstを指定してあげましょう。
エラー内容ですが、

ruby

1undefined method `title' for #<Array:0xb98cd98>

というのは、Arrayクラスにtitleっていうメソッドなんてありませんというエラーです。
titleって呼び出しているのは@stagesだから@stagesが配列になっているとわかります。

追記

ruby

1a = Stage.find_by(id: 6)

これだとaはStageモデルのインスタンスが返ってきます。ですので、a.titleと呼び出すことが出来ます。find_bywherefirstをあわせた様な物ですので、こう書き換えられます。

ruby

1a = Stage.where(id: 6).first

で、seenさんが使った

ruby

1a = Stage.find_by_sql(['select * from stages where id = ?', 6])

これですが、今回id=6のものが1つしか無いのでStageモデルが返ってくると思い込んでいますが、find_by_sqlでどのようなSQLが実行されるかによって返ってくる件数が違います。
ですので、find_by_sqlはどのような場合でも配列で返ってくるわけです。
ということはwhereと同じようにfirstをつけてやればいいわけです

投稿2017/10/16 00:24

編集2017/10/24 02:01
chelsy7110

総合スコア596

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

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

seen

2017/10/19 13:54

ご回答ありがとうございます。 せっかくご回答をいただいたのですが一部、私自身で理解できませんでした。  find_byはハッシュ、find_by_sqlは配列ということになりますと質問の @stages = Stage.find_by_sql(['select * from stages where id = ?', 6]) の where id = ?', 6 はどんな意味になるのでしょうか。
seen

2017/10/19 13:56

私はハッシュと混同してしまい、「id番号6番のレコード」と解釈してしまいました。
seen

2017/10/24 08:07

何度もすみません、ありがとうございました。  今回は作成中のアプリの機能の中で参考にしたサイトにfind_by_sqlを使ったものがあり突貫で使いたかったのですが自分自身の理解が足りないようです。chelsy7110さんのご回答を参考に勉強しようとおもいます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問