こんにちは、Fusicの中野です。
Ruby on Rails(ActiveSupport) にObject#tryという便利なメソッドがあります。
1 2 3 4 5 | a = { b: 1} a.try(:[], :b) # => 1 a = nil a.try(:[], :b) # => nil |
で、便利なのでついついこんな感じで書いてしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Tables < ActiveRecord::Migration def up create_table :as do |t| t.text :title t.timestamps end create_table :bs do |t| t.text :title t.integer :a_id t.timestamps end create_table :cs do |t| t.text :title t.integer :b_id t.timestamps end a = A.new(title: "title") a.bs << B.new(title: "title1-1"); a.bs << B.new(title: "title1-2") a.bs[0].cs << C.new(title: "title1-1-1"); a.bs[0].cs << C.new(title: "title1-1-2"); a.bs[0].cs << C.new(title: "title1-1-3") a.bs[1].cs << C.new(title: "title1-2-1") a.save end def down; drop_table :as; drop_table :bs; drop_table :cs; end end # ↑のようなデータがあったとして c = C.find_by_id(1) c.try(:b).try(:a).try(:title).try { |_| "#{_} == title" } # => "title == title" |
なんかかっこ悪いので、こちらの素敵なライブラリを使ってみましょう。
1 2 3 4 5 6 7 | require 'lambda_driver' c = C.find_by_id(1) (-:try < c).(&:b >> :a >> :title >> lambda { |_| "#{_} == title" }) # => "title == title" c = C.find_by_id(10) (-:try < c).(&:b >> :a >> :title >> lambda { |_| "#{_} == title" }) # => nil |
すごく、ナウいですね。
最後に
最近、このブログがPHPばかりだったので、なんとなくRubyの記事を載せてみました。
決して社内研修の次の日なので、疲れているとかではありません。