Logical Rabbit.

さくらのVPS

active_support

mattr_accessor が欲しいときは。

active_support/core_ext/module/attribute_accessors.rb をrequire。ちぃ覚えた。

Moduleを拡張しているのでrequireすればクラスに導入されますね。効果としてはクラスとインスタンス、両方のアクセサとして共通に使えるアクセサが定義できるようです。

ActiveRecord::Base.loggerを流用しようとして存在に気づいた。

gem 'activerecord' した環境で試してみると、以下のような感じ。

$ bundle exec ruby -e '
require "active_support/core_ext/module/attribute_accessors"
require "logger"

class TestClassA
  mattr_accessor :logger
end

TestClassA.logger = Logger.new( STDERR )

TestClassA.logger.info( "Message from class method." )
TestClassA.new.logger.info( "Message from instance method." )

puts "Class method logger; #{TestClassA.logger}"
puts "Instance method logger; #{TestClassA.new.logger}"
'
I, [2015-05-15T12:04:17.514556 #30503]  INFO -- : Message from class method.
I, [2015-05-15T12:04:17.514671 #30503]  INFO -- : Message from instance method.
Class method logger; #<Logger:0x007f12f269f198>
Instance method logger; #<Logger:0x007f12f269f198>

確かにクラスメソッドでアクセスしてもインスタンスメソッドでアクセスしても、同じオブジェクトが入ってる。

参考: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb