ruby-on-rails - Rails 模型——非持久类成员或属性?

标签 ruby-on-rails ruby

对于 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/

相关文章:

ruby-on-rails - 什么可能导致预定的 Rails 事件作业消失?

ruby-on-rails - 在初始化时设置 default_url_options

ruby-on-rails - rails : Passing API Keys to the Controller

ruby - 匹配与上一组匹配的相同数量的字符

ruby-on-rails - 如何在 Rails/w Devise 中注销时使特定 session 无效?

ruby-on-rails - Ruby aws-sdk - 超时错误

ruby-on-rails - Controller 规范中的 RSpec stub 辅助方法

ruby - 在 Mac OS X 上的 Ruby 中检测 64 位 CPU

ruby-on-rails - 如何使用 OpenSSL::Cipher 加密 UTF-8 字符串中的数据?

arrays - 使用 Ruby 中的数组过滤数组数组