2006-11-01 (Wed) [長年日記]

_ Rails の ActiveRecord で valueForKeyPath はてなブックマークに追加 del.icio.usに追加 MM/Memoに追加

rails でも WebObjects で言うところの valueForKeyPath が欲しくなった。

valueForKey は Object#send で良いのだけど、 valueForKeyPath に相当する機能が ruby にも rails にも見つけられなかった。

ってなわけで、Koders:KeyValueCoding.rb から、

class Object
  def valueForKeyPath(keyPath)
    keys = keyPath.split('.')
    result = self
    keys.each_index do |i|
    if keys[i] =~ /^[&](.*)/
      return result.send($1) {|val|
        val.valueForKeyPath(keys[i+1..-1].join('.'))
      }

      result = result.valueForKey keys[i]
    end
    result
  end
end

の部分をコピッってきて、どこに書くのが正しいのかよく わからないけど、なんとなく controller/application.rb の 中あたりに書いてしまう。

これで、あるオブジェクトの属性を求めたいときに そのオブジェクト内の属性なのか、 リレーションシップをたどった先のオブジェクトの 属性なのかを気にせずに全部

Object#valueForKeyPath(keypath)

に統一できる。

例えば、

<% for keypath in %w|user.name title body| %>
  <td><%=h @article.valueForKeyPath(keypath) %></td>
<% end %>

とか。

Permalink | このエントリを含むはてなブックマーク | このエントリをはてなブックマークに追加 | このエントリを含むMM/Memo | このエントリをMM/Memoに追加 | このエントリを含むdel.icio.us | このエントリをdel.icio.usに追加 | Tags: wo rails
[]