对于 Rails 模型,是否可以/建议让一个类的成员不持久保存到数据库中?
我想将用户最后选择的类型存储在 session 变量中。由于我无法从我的模型中设置 session 变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回 Controller 。
你能有这样的类(class)成员吗?
最佳答案
将非持久属性添加到 Rails 模型就像任何其他 Ruby 类一样:
class User < ActiveRecord::Base
attr_accessor :someattr
end
me = User.new(name: 'Max', someattr: 'bar')
me.someattr # "bar"
me.someattr = 'foo'
扩展解释:
在 Ruby 中,所有实例变量都是私有(private)的,不需要在赋值前定义。
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 根据数据库确定要添加的属性模式)。
关于ruby-on-rails - Rails 模型——非持久类成员或属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29989416/