最近知ったRailsの便利なメソッド

最近になって知った Railsの便利なメソッドを紹介したいと思います。

pluck

http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-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!

http://api.rubyonrails.org/classes/Rails/ConsoleMethods.html#method-i-reload-21

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

http://api.rubyonrails.org/classes/NilClass.html#method-i-try

viewのコードを書いている場合に多いのですが、nil である可能性があるobject のメソッド を呼び出す場合に

名前: <%= @user.name unless @user.nil? %>

このように 空かどうかの判定を書くことがあると思います。
同じことをtryを使って書くと

名前: <%= @user.try(:name) %>

こちらのほうがスッキリしています。
引数の渡し方がわからなかったのですが、以下のようにすれば良いようです。

User.try(:find, 1)

Rails3 の頃は存在しないメソッドを指定するとNoMethodError になりましたが
Rails4 からはrespond_to? でメソッドの有無をチェックするようになったためより気軽に使えるようになりました。

persisted?

http://api.rubyonrails.org/classes/ActiveModel/Model.html#method-i-persisted-3F

Active Record object がDB に保存済みかどうかを判定するメソッド です。

user = User.first
user.persisted?
#=> true
new_user = User.new
user.persisted?
#=> false

Active Record objectの状態をチェックするためのメソッド は他にもいろいろあるので使いこなせると良いですね。

delegate

http://api.rubyonrails.org/classes/Module.html#method-i-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 のメソッドであることが多いです。
たまにはドキュメントを読んだり
ソースコードを読んだりしてみると新しい発見があるかもしれません。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

tsunekawa

tsunekawaの書いた記事

Web開発
Vim部活動日誌

2014年06月20日

BPSアドベントカレンダー

人気の記事