teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/10/24 02:01

投稿

chelsy7110
chelsy7110

スコア596

answer CHANGED
@@ -6,4 +6,20 @@
6
6
  undefined method `title' for #<Array:0xb98cd98>
7
7
  ```
8
8
  というのは、**Arrayクラスにtitleっていうメソッドなんてありません**というエラーです。
9
- titleって呼び出しているのは@stagesだから@stagesが配列になっているとわかります。
9
+ titleって呼び出しているのは@stagesだから@stagesが配列になっているとわかります。
10
+
11
+ ###### 追記
12
+ ```ruby
13
+ a = Stage.find_by(id: 6)
14
+ ```
15
+ これだと```a```はStageモデルのインスタンスが返ってきます。ですので、```a.title```と呼び出すことが出来ます。```find_by```は```where```と```first```をあわせた様な物ですので、こう書き換えられます。
16
+ ```ruby
17
+ a = Stage.where(id: 6).first
18
+ ```
19
+ で、seenさんが使った
20
+ ```ruby
21
+ a = Stage.find_by_sql(['select * from stages where id = ?', 6])
22
+ ```
23
+ これですが、今回id=6のものが1つしか無いのでStageモデルが返ってくると思い込んでいますが、find_by_sqlでどのようなSQLが実行されるかによって返ってくる件数が違います。
24
+ ですので、find_by_sqlはどのような場合でも配列で返ってくるわけです。
25
+ ということはwhereと同じようにfirstをつけてやればいいわけです