ruby-on-rails - rails 3 中使用的 ActiveRecord 自定义属性在 rails 4 中不起作用

标签 ruby-on-rails ruby-on-rails-4 activerecord attributes ruby-on-rails-3.2

我在 rails 3.2 中有以下代码:

class Cart < ActiveRecord::Base
  def self.get_details()
    cart_obj = Cart.first
    cart_obj["custom"] = 1 #Here *custom* is not the column in database
  end
end

我可以在需要时从 cart_obj 对象访问列 custom

但我们正计划升级到 Rails 4,但它在那里无法正常工作。除了使用 attr_accessor 之外,还有其他解决方法吗??

最佳答案

听起来像猴子补丁是你要走的路:

class ActiveRecord::Base
  def [](key)
    return super(key) if self.class.column_names.include?(key.to_sym)
    self.class.send :attr_accessor, key.to_sym unless self.class.instance_variable_defined?("@#{key}".to_sym)
    self.instance_variable_get("@#{key}".to_sym)
  end

  def []=(key, val)
    return super(key, val) if self.class.column_names.include?(key.to_sym)
    self.class.send :attr_accessor, key.to_sym unless self.class.instance_variable_defined?("@#{key}".to_sym)
    self.instance_variable_set("@#{key}".to_sym, val)
  end
end

或者,如果您想关注它:

module MemoryStorage
  extend ActiveSupport::Concern
  def [](key)
    return super(key) if self.class.column_names.include?(key.to_sym)
    self.class.send :attr_accessor, key.to_sym unless self.class.instance_variable_defined?("@#{key}".to_sym)
    self.instance_variable_get("@#{key}".to_sym)
  end

  def []=(key, val)
    return super(key, val) if self.class.column_names.include?(key.to_sym)
    self.class.send :attr_accessor, key.to_sym unless self.class.instance_variable_defined?("@#{key}".to_sym)
    self.instance_variable_set("@#{key}".to_sym, val)
  end
end

class Cart < ActiveRecord::Base
  include MemoryStorage

  def self.get_details()
    cart_obj = Cart.first
    cart_obj.db_column = 'direct DB access'
    cart_obj["custom"] = 'access to "in-memory" column'
  end
end

关于ruby-on-rails - rails 3 中使用的 ActiveRecord 自定义属性在 rails 4 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27858765/

相关文章:

ruby-on-rails - 如何定制 spree 电商?

ruby-on-rails - rails_admin gem 破坏了 Rails 4.1 中引入的枚举属性

ruby-on-rails - Rails 4 错误:ActiveRecord::RecordNotFound/找不到 'id' =

php - 幕后 : How does an ORM "think"?

mysql - Activerecord中如果order字段全部相同,是否有默认顺序?

java - 如何将 Android 应用程序连接到 RoR 数据库

ruby-on-rails - 在类主体中声明的 Ruby 方法调用

ruby-on-rails-4 - 回形针更改 URL/路径

mysql - 为什么我的 rails 插入速度很慢,即使我使用线程?

ruby-on-rails - Rails错误: uninitialized constant User::Nil