関連記事
- 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter1】
- 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter2】
- 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter3】
- 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter4】 ★今ここ
- 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter5】
- 特にありませんでしたので、作成していません。
- 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter6 最終回
】
私の環境
- Windows 10 Home 64bit
- Ruby 2.2.6
- Rails 5.0.2
つまずきやすいポイント
[p.159] データ検索でのLIMITとOFFSETの併用
下記サンプルソース(リスト4-15)は、順次処理(副問合せのような動作)をするのかな?と迷いましたが、それは間違いでした。
@people = Person.all.limit(2).offset(3)
誤った予想:
- 2行を検索する。(limit)
- 検索結果に対して、3行目以降のみ絞り込む。(offset)
正しくは1つのクエリを構築するための記述でした。そのため、limitとoffsetを入れ替えても全く同じSQLが発行され、同じ動作をします。
@people = Person.all.limit(2).offset(3)
#=> SELECT "people".* FROM "people" LIMIT 2 OFFSET 3
@people = Person.all.offset(3).limit(2)
#=> SELECT "people".* FROM "people" LIMIT 2 OFFSET 3
実際の動作(入れ替えても一緒):
- 3行目以降のみ対象(offset)とし、2行検索する(limit)。
正確には、Ruby on Rails 側はSQLを作っているだけにすぎないので、処理自体はDBに依存します。詳しくは、SQLiteのLIMIT/OFFSETについて調べましょう。
また、今回はSQLiteを使っておりLIMIT/OFFSETに対応できましたが、他のDBの場合はどのように記述するのか?は別の機会に勉強したいですね。
[p.274] messages.scssの作成も忘れずに
ソースばかり並ぶ章なので見逃しやすいですが、本文中にmessages.scssの作成が指示されています。スクリーンショットとあわせるなら、people.scssの丸コピーをしてください。(文中にあるcardsは背景グレーのものなのでかなり見づらいです。)
[p.288] has_one と belongs_to の使い分け
ちょっと分かりづらかったの自分なりに整理・・・
- has_one は、主となるモデルに記述する。
- belongs_to は、参照しているモデルに記述する。(外部キーをもっている方と解釈すると分かりやすい。)
※ 現実的には、多対多になるケース(設計がどうなのという議論は置いといて)等、世の中には様々なケースがあるので、Ruby on Rails で前提とする設計セオリー&どこまで対応可能かは別途掘り下げて整理しておきたいです。
[p.327] リスト4-64
サポートページのソース一式に含まれていません。手入力だとかなり非効率なので置いておきます。
get 'blogs/index'
get 'blogs', to: 'blogs#index'
get 'blogs/:page', to: 'blogs#index'
get 'blogs/genre/:id', to: 'blogs#genre'
get 'blogs/genre/:id/:page', to: 'blogs#genre'
get 'blogs/show/:id', to: 'blogs#show'
get 'blogposts/index'
get 'blogposts', to: 'blogposts#index'
get 'blogposts/delete/:id', to: 'blogposts#delete'
post 'blogposts/delete', to: 'blogposts#delete'
post 'blogposts/delete/:id', to: 'blogposts#delete'
get 'blogposts/add'
post 'blogposts/add'
get 'blogposts/:id', to: 'blogposts#edit'
patch 'blogposts/:id', to: 'blogposts#edit'
get 'blogposts/delete'
get 'bloggenres/index'
get 'bloggenres', to: 'bloggenres#index'
get 'bloggenres/add'
post 'bloggenres/add'
get 'bloggenres/:id', to: 'bloggenres#edit'
patch 'bloggenres/:id', to: 'bloggenres#edit'
get 'blogconfigs/index'
get 'blogconfigs', to: 'blogconfigs#index'
get 'blogconfigs/edit'
patch 'blogconfigs/edit'
誤植
一部ソースレビューのような内容も含みます。
[p.226] リスト4-4
- 誤) tr閉じタグが重複している。
<table>
<%= form_tag(controller: "people", action: "find") do %>
<tr><th>FIND</th>
<td><%= text_field_tag("find") %></td></tr>
<tr><th></th>
<td><%= submit_tag("Click") %></td></tr>
</tr>
<% end %>
</table>
- 正) tr閉じタグを除去する。
<table>
<%= form_tag(controller: "people", action: "find") do %>
<tr><th>FIND</th>
<td><%= text_field_tag("find") %></td></tr>
<tr><th></th>
<td><%= submit_tag("Click") %></td></tr>
<% end %>
</table>
※下記を基にしたと思われる 4-3章のソースも同様の複数箇所で重複しています。
[p.242] リスト4-14
- 誤) 使用していない変数fが存在する。
if request.post? then
f = params[:find].split(',')
@people = Person.where('name like ?', '%' + params[:find] + '%').order 'age asc'
end
- 誤) 使用していない変数fを除去する。
if request.post? then
@people = Person.where('name like ?', '%' + params[:find] + '%').order 'age asc'
end
今後
引き続き、詰まりやすそうかなあというポイントがあればまた投稿します。