【问题标题】:How do I handle migration of ActiveRecord::Base which implemented a tableless model如何处理实现无表模型的 ActiveRecord::Base 迁移
【发布时间】:2012-02-04 05:39:17
【问题描述】:

我们有以下类来处理来自外部 API 的 SOAP 响应,这在 ruby​​ 1.8.7 中运行良好,但它正在寻找一个包含这些列的表,这些列在迁移(从未存在)到 ruby​​ 1.9 后。 2/rails 3.1,如何处理这种迁移?

class SoapResponse < ActiveRecord::Base 
  def self.columns
    @columns ||= [];
  end

  def self.column(name, sql_type = nil, default = nil, null = true)
    columns << ActiveRecord::ConnectionAdapters::Column.new(
      name.to_s, default, sql_type.to_s, null)
  end

  def save(validate = true)
    validate ? valid? : true
  end

  column :soap_payload, :text
  serialize :soap_payload
end

【问题讨论】:

  • 你为什么要为没有表支持的东西子类化 ActiveRecord::Base?
  • 它是一个旧应用程序,不确定设计决策是什么,我应该如何使用 ruby​​ 1.9/rails 3 实现这一目标

标签: ruby-on-rails soap model ruby-on-rails-3.1 migration


【解决方案1】:

你没有(有任何迁移)。

您没有迁移,也没有从 ActiveRecord::Base 继承,因为那是数据库 ORM 组件。

如果您使用生成器创建模型,请使用--skip-migration 以避免生成数据库迁移文件。

您仍然可以获得验证和转换,例如

class SoapResponse
  include ActiveModel::Validations
  include ActiveModel::Conversion

如果你想要一些设置数据(即常量,假设没有 db!)你可以在这里定义它们(常量以大写开头)。

【讨论】:

    【解决方案2】:

    我猜你想要 ActiveRecord::Base 的序列化功能。这似乎是这个类使用它的唯一目的。如果是这样,请尝试在您的类定义中调用它:

    self.abstract_class = true
    

    或者您可以尝试使用ActiveModel::Serialization

    您的代码中的模式看起来像 this answer for table-less AR models in Rails 2 中建议的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多