是否有可能/建议将类的成员保留到数据库中以用于rails模型?
我想存储用户在会话变量中选择的最后一种类型。由于我无法从模型中设置会话变量,因此我希望将值存储在“虚拟”类成员中,该成员只将值传递回控制器。
你能有这样的班级成员吗?
答案 0 :(得分:7)
将非持久化属性添加到Rails模型就像任何其他Ruby类一样:
class User < ActiveRecord::Base
attr_accessor :someattr
end
me = User.new(name: 'Max', someattr: 'bar')
me.someattr # "bar"
me.someattr = 'foo'
扩展说明:
在Ruby中,所有实例变量都是私有的,不需要在赋值之前定义。
attr_accessor
创建了一个setter和getter方法:
class User < ActiveRecord::Base
def someattr
@someattr
end
def someattr=(value)
@someattr = value
end
end
这里有一件特别的事情; 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">
Ruby中的类也可以随时重新打开,ActiveRecord使用此功能“自动神奇地”根据数据库列为模型添加getter和setter(ActiveRecord根据数据库确定要添加的属性)模式)。
答案 1 :(得分:1)
是的,你可以,下面的代码允许你设置my_class_variable并在模型中引用它为@my_class_variable
class MyCLass < ActiveRecord::Base
attr_accessor :my_class_variable
def do_something_with_it
@my_class_variable + 10
end