よく使う便利なメソッドをまとめてみた。
pluck
map
でもいいけどpluck
のほうがselectするカラムを指定するので、効率がよい。
pry(main)> User.where(id: 100).map(&:id)
SELECT `users`.* FROM `users` WHERE `users`.`id` = 100
=> [100]
pry(main)> User.where(id: 100).pluck(:id)
SELECT `users`.`id` FROM `users` WHERE `users`.`id` = 100
=> [100]
参考 : http://blog.livedoor.jp/sasata299/archives/51847390.html
参考url読むとわかるが、実はselectの絞り込みの分だけではなく、
ActiveRecordオブジェクトを生成しないかららしい。
each_with_object
「初期化して、eachして値を格納してその値を返す」という処理は、
そのまま書けば下記のように書く(最後のobjとか忘れがち)
def test(array)
obj = []
array.each do |value|
obj << {value: value}
end
obj
end
しかしeach_with_object
を使えばもっと簡潔に書ける
def test(array)
array.each_with_object([]) do |value, obj|
obj << {value: value}
end
end
first_or_create
そのままの意味。
あったら引っ張ってきて、なかったら作る
Book.where(title: "初めてのruby").first_or_create
find_each
each
だと全データをメモリ展開してしまうので、
たくさんのデータを対象にした処理とかはメモリから溢れてしまうかもしれない…
なのでfind_each
で少しずつ展開する方が良い。
User.where(push_flag: true).find_each do |user|
push_method(user)
end
ちなみにデフォルトは1000件だが、下記のようにまとめる量を指定することもできる。
find_each(batch_size: 500)
参考 : http://blog.livedoor.jp/sasata299/archives/51882704.html
to_sql
吐き出されるqueryが確認できる。
pry(main)> User.where(id: 100).to_sql
=> "SELECT `users`.* FROM `users` WHERE `users`.`id` = 100"
explain
EXPLAINの出力を確認できる。
参考のurlとかを見ながらチューニングしてる
pry(main) > puts User.where(id: 100).explain
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 100
EXPLAIN (0.2ms) EXPLAIN SELECT `users`.* FROM `users` WHERE `users`.`id` = 100
EXPLAIN for: SELECT `users`.* FROM `users` WHERE `users`.`id` = 100
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
参考 : http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
まとめ
まだまだ色々ありますが、便利なメソッドはつかっていきたい!