LoginSignup
3
1

More than 5 years have passed since last update.

書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter4】

Last updated at Posted at 2017-04-14

関連記事

私の環境

  • 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)

誤った予想:

  1. 2行を検索する。(limit)
  2. 検索結果に対して、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 

実際の動作(入れ替えても一緒):

  1. 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

今後

引き続き、詰まりやすそうかなあというポイントがあればまた投稿します。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1