業務でmongoDBを使用しているのですがデータが取得されるタイミングが曖昧のまま実行処理をおまじないのように書くだけだったので、部下に説明するタイミングできちんと理解しようと思った今日。
おまじないコード
# 複数データを取得するときのおまじない 【.to_a rescue []】
items = item.where(category: "food").to_a rescue []
# 1件データを取得するときのおまじない 【.first rescue nil】
items = item.where(category: "food").first rescue nil
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ruby
items = item.where(category: "food").paginate(per_page: 2, page: 1)
.where()
や.pagination()
メソッドはクエリオブジェクト(検索条件)を組み立てるだけで
DBに対する実際のクエリは実行されていない。
なので↑の状態だとデータを取得する対象のDBと検索条件が変数items
に格納されているだけ。
.class
で型を確認するとArray
ではなくWillPaginate::Collection
と出力される。
ruby
items = item.where(category: "food").paginate(per_page: 2, page: 1).to_a rescue []
実際にデータを取得するためにはクエリを実行(.to_a, .first, .each() .countなど)
する必要がある。
クエリオブジェクトが格納された変数を展開するとデータが表示される理由
ruby
items = item.where(category: "food").paginate(per_page: 2, page: 1)
html
<!--- 確認用 --->
<div>#{items}</div>
式展開すると.to_s
が走るのでそのタイミングでクエリが実行されてデータが表示される。
実際はitems
にデータが格納されているわけではない。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
自分の中では前よりも理解できたし、
これで調べる前よりかは理解できる説明できるかなー…