最近になって知った Railsの便利なメソッドを紹介したいと思います。
pluck
User.select(:id).where("age >= ?", 20).map(&:id)
こんなコードが
User.where("age >= ?", 20).pluck(:id)
こうなります
Rails3系では指定できるカラムはひとつだけでしたが、Rails4から複数カラムを指定できるようになりました。
User.where("age >= ?", 20).pluck(:id, :name)
#=> [[1, '太郎'], [2, '花子'], [3, '二郎']]
Rails3系でもmultipluck というgemを使えば同じことができるみたいですね。
reload!
rails console で動作を確認しながらコードを書くことがあるのですが、
今まではコードを修正する度にexit してrails console を再度実行していましたが、リロード用のコマンドがありました。
reload! を実行するとexit しなくてもRailsをリロードしてくれます。
reload! 実行前に変数に格納していたobjectはリロードされていないので注意が必要です。
irb(main):001:> user = User.first
irb(main):002:> reload!
Reloading...
=> true
irb(main):003:0> user.new_method
NoMethodError: undefined method `method' for ....
irb(main):004:0> user.reload
irb(main):005:0> user.new_method
try
viewのコードを書いている場合に多いのですが、nil である可能性があるobject のメソッド を呼び出す場合に
名前: <%= @user.name unless @user.nil? %>
このように 空かどうかの判定を書くことがあると思います。
同じことをtryを使って書くと
名前: <%= @user.try(:name) %>
こちらのほうがスッキリしています。
引数の渡し方がわからなかったのですが、以下のようにすれば良いようです。
User.try(:find, 1)
Rails3 の頃は存在しないメソッドを指定するとNoMethodError になりましたが
Rails4 からはrespond_to? でメソッドの有無をチェックするようになったためより気軽に使えるようになりました。
persisted?
Active Record object がDB に保存済みかどうかを判定するメソッド です。
user = User.first
user.persisted?
#=> true
new_user = User.new
user.persisted?
#=> false
Active Record objectの状態をチェックするためのメソッド は他にもいろいろあるので使いこなせると良いですね。
delegate
指定したクラスのメソッドを簡単に呼び出せるようにしてくれます。
class User < ActiveRecord::Base
#t.string :name
#t.string :email
has_one :profile
end
class Profile < ActiveRecord::Base
#t.integer :age
#t.string :favorites
#t.string :location
belongs_to :user
delegate :name, to: :user
end
profile = Profile.find(1)
# 普通はuser を経由してから呼び出します
profile.user.name #=> "太郎"
profile.user.email #=> "sample@example.com"
# delegate するとprofile から直接呼び出せるようになります
profile.name #=> "太郎"
profile.email #=> NoMethodError: undefined method `email'...
ドキュメントには他にもいろいろなパターンのわかりやすいサンプルコードが掲載されているので
一度目を通しておくと良いと思います。
他の便利メソッド
Railsを使っていて便利だなぁと思うメソッドはActiveSupport のメソッドであることが多いです。
たまにはドキュメントを読んだり
ソースコードを読んだりしてみると新しい発見があるかもしれません。