Jef*_*eff 5 ruby ruby-on-rails
是否有可能/建议将类的成员保留到数据库中以用于rails模型?
我想存储用户在会话变量中选择的最后一种类型.由于我无法从我的模型中设置会话变量,因此我希望将值存储在"虚拟"类成员中,该成员只将值传递回控制器.
你有这样的班级成员吗?
将非持久化属性添加到Rails模型就像任何其他Ruby类一样:
class User < ActiveRecord::Base
attr_accessor :someattr
end
me = User.new(name: 'Max', someattr: 'bar')
me.someattr # "bar"
me.someattr = 'foo'
Run Code Online (Sandbox Code Playgroud)
扩展说明:
在Ruby中,所有实例变量都是私有的,不需要在赋值之前定义.
attr_accessor 创建一个setter和getter方法:
class User < ActiveRecord::Base
def someattr
@someattr
end
def someattr=(value)
@someattr = value
end
end
Run Code Online (Sandbox Code Playgroud)
这里有一件特别的事情; Rails获取您传递给的哈希User.new并将值映射到属性.您可以在普通的ruby类中模拟此行为,例如:
class Foo
attr_accessor :bar
def initialize(hash)
hash.keys.each do |key|
setter = "#{key}=".intern
self.send(setter, hash[key]) if self.respond_to? setter
end
end
end
> Foo.new(bar: 'baz')
=> <Foo:0x0000010112aa50 @bar="baz">
Run Code Online (Sandbox Code Playgroud)
Ruby中的类也可以在任何时候重新打开,ActiveRecord使用此功能"自动神奇地"根据数据库列向模型中添加getter和setter(ActiveRecord根据数据库模式确定要添加的属性).