【问题标题】:ActiveRecord::Type::Value casting in Rails 4Rails 4 中的 ActiveRecord::Type::Value 转换
【发布时间】:2023-03-14 17:44:01
【问题描述】:

我们想在 Rails4 应用程序中使用Whole Value pattern

我们知道在Rails5中,如果我们想让OurModel为属性NameType使用自定义的整值类型:name,我们可以像这样定义自定义类型:

class NameType < ActiveModel::Type::Value
  def cast(value)
    Name(value)
  end

  def serialize(value)
    value.to_s
  end
end

然后在OurClass

class OurClass < ApplicationRecord
  attribute :name, NameType.new
  ...
end

在将模型保存到数据库时为我们提供完全透明的序列化,并在从数据库或手动创建模型时转换为全值类型(这在RubyTapas episode 中进行了描述,仅限订阅者)。

在 Rails 4 中可以实现类似的优雅吗?如果有,怎么做?

【问题讨论】:

  • 如果你尝试同样的事情,你会发现什么? (即症结在哪里)(注意:我对此完全不熟悉,因此向我们展示差异可以帮助我们帮助您找到解决方案)

标签: ruby-on-rails ruby-on-rails-4 activerecord ruby-on-rails-5


【解决方案1】:

this video 中,David Copeland 使用 serialize 的方法略有不同,但我相信最终会产生非常相似的效果。

class OurClass < ApplicationRecord
  serialize :name, Name
  ...
end

那么你的整个值(或像 NameType 这样的代理类)需要包含 loaddump 方法以遵守可序列化接口:

class Name
  ...
  def self.load(value)
    self.new(value)
  end

  def self.dump(name)
    name.to_s
  end
end

然后您可以将 name 属性与 Name 整体值一起使用:

OurClass.new(name: 'a name').name # => A Name instance
OurClass.find_by(name: Name.new('a saved name')).name # => A Name instance

【讨论】:

  • 谢谢!我会看看这个视频,看看这是否解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 2013-10-05
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多