Rails模型 - 非持久类成员或属性?

时间:2015-05-01 15:04:28

标签: ruby-on-rails ruby

是否有可能/建议将类的成员保留到数据库中以用于rails模型?

我想存储用户在会话变量中选择的最后一种类型。由于我无法从模型中设置会话变量,因此我希望将值存储在“虚拟”类成员中,该成员只将值传递回控制器。

你能有这样的班级成员吗?

2 个答案:

答案 0 :(得分:7)

将非持久化属性添加到R​​ails模型就像任何其他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