インスタンス変数をレコードにアタッチする組み込みの方法はありますか?たとえば、:を含むクラスUser
があるとします。foo
attr_accessor
class User < ActiveRecord::Base
...
attr_accessor :foo
end
私が行った場合
u = User.first
u.foo = "bar"
u.foo # -> "bar"
User.find(1).foo # => nil
これは正しい動作であり、その理由を理解しています。インスタンス変数は、レコードではなくインスタンス(メモリ内)に存在します。私が欲しいのはレコード変数のようなものなので、上記の例では、アプリケーションの同じインスタンス内でu.foo
同じ値をUser.find(1).foo
返します。永続性は必要ありません。テーブルの列になるのは適切ではありません。たとえば、コントローラーアクション、コンソールセッションなどのライフサイクル中に、同じレコードに対して同じ値を返すのが適切です。と同じである必要がある理由がないため、を介してクラス変数が必要です。foo
foo
cattr_accessor
User.find(1).foo
User.find(2).foo
私が思いつくことができる最善の策は、クラス変数配列とインスタンスメソッドを使用してそれを偽造し、配列の適切な要素を取得/設定することです。
class User < ActiveRecord::Base
cattr_accessor :all_the_foos
self.all_the_foos = Array.new
def foo
self.all_the_foos[id]
end
def foo= new_foo
self.all_the_foos[id] = new_foo
end
end
このALMOSTは機能しますが、保存されていないレコードでは機能しません。たとえば、User.new.foo = "bar"
失敗します。