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 %>
とか。