Ruby学習を進めていると「あれ、これはRubyのメソッド?Railsのメソッド?どっちを使えばいいの?」と迷うことが多くなりました。
Ruby と Rails のメソッドの使い分け について、今後のためにまとめていきます。
1. Ruby と Rails の関係性
基本構造
- Ruby: プログラミング言語(C言語で実装)
- Rails: Ruby をベースにしたWebアプリケーションフレームワーク
Rails(フレームワーク)
↓ 拡張
Ruby(言語)
↓ 実装
C言語
ActiveSupport の役割
RailsではActiveSupportがRubyの標準クラスを拡張して、便利なメソッドを追加しています。
Rails由来のメソッド例:
-
present?,blank? tryexists?in?delegate
2. 代表的な違いと使い分け
(1) empty?vspresent?vsblank?
data = []
# Ruby 標準
data.empty? # => true(空配列かどうか)
# Rails 拡張
data.present? # => false(「中身がある?」)
data.blank? # => true(「空またはnil?」)
# より実践的な例
user_name = ""
# Rubyの場合
if user_name.nil? || user_name.empty?
puts "名前が未入力です"
end
# Railsの場合
if user_name.blank?
puts "名前が未入力です"
end
使い分け
-
Ruby
empty?: 単純に「空かどうか」だけを判定 -
Rails
present?/blank?: nil・空文字・空配列をまとめて判定できて便利
(2)any?vsexists?
# 配列に対して(Ruby Enumerable)
users = [user1, user2, user3]
users.any? { |u| u.active? }
# DBに対して(Rails ActiveRecord)
User.exists?(id: 1)
User.where(active: true).exists?
使い分け
-
any?:配列やEnumerableオブジェクト向け -
exists?:DBクエリ向け(大量データでも効率的)
(3) Rubyの真偽値の特徴
Rubyでは「空配列も真」という特徴があるようです。
data = []
if data
puts "空配列でも真になる" # ← こちらが実行される
else
puts "偽"
end
# Rails のpresent?なら期待通りの動作
if data.present?
puts "データあり"
else
puts "データなし" # ← こちらが実行される
end
3. その他のよく使うRails拡張メソッド
try-nilセーフなメソッド呼び出し
# Ruby標準(nilチェックが面倒)
user&.profile&.name
# Rails拡張(読みやすい)
user.try(:profile).try(:name)
in?-包含判定
# Ruby標準
["active", "pending"].include?(status)
# Rails拡張(自然な読み方)
status.in?(["active", "pending"])
4. 実際の使い分け
基本方針
-
原則:Rubyのメソッドを優先した方がいいみたい
- 標準的で壊れにくい
- Ruby 知識があれば他のプロジェクトでも通用する
- パフォーマンスが優れていることが多い
-
Railsメソッドは便利さ重視で採用
-
present?/blank?は開発の現場で非常によく使われるようです。 - DB関連は
exists?などRails独自メソッドの方が効率的みたいです。
-
-
こだわりすぎない
- 書き換えは簡単
- まずは読みやすく正しく動くコードを書く
判断フローチャート
やりたいことが明確
↓
Ruby メソッドで実現可能?
↓ Yes
Ruby メソッドを使用
↓ No(または煩雑)
Rails メソッドを検討
↓
より読みやすい・効率的な方を選択
5. まとめ
- Ruby = 言語、Rails = フレームワーク(ActiveSupport で拡張)
-
empty?とpresent?/blank?の違いを理解する - 配列には
any?、DBにはexists? - 迷ったらRuby優先、便利な場面でRails
- 最終的には 書きやすさ・読みやすさ を優先
参考