【问题标题】:What's the deal with Rails' alter_table method?Rails 的 alter_table 方法是怎么回事?
【发布时间】:2009-12-27 23:24:57
【问题描述】:

我一直在为我正在开发的数据库使用 sqlite3,我的应用程序已经变得足够复杂,以至于使用起来有点慢。

我刚刚切换到 MySQL 并运行 rake db:create ; rake db:migrate,但我的一次迁移失败并显示以下错误消息:

undefined method `alter_table` for #<ActiveRecord::ConnectionAdapters::MysqlAdapter:0xb6e6088c>

我用谷歌搜索了一下,什么也没找到。然后我检查了 API 并没有记录方法alter_table。但是,它确实适用于 sqlite3!

这是我的迁移:

class AddSettingsToUsers < ActiveRecord::Migration
  def self.up
    alter_table :users do |t|
      t.text signature
      ...
    end
  end

  ...

end

这与 sqlite3 一样工作。

我要疯了吗?我是否只是发明了这种方法,而它恰好是一个未记录的功能,仅适用于受支持的数据库的子集?

有人对此有所了解吗?

【问题讨论】:

    标签: mysql ruby-on-rails migration alter-table


    【解决方案1】:

    正如其他人提到的,这可能是一种仅用于 sqlite 的方法。 文档中提到了 change_table,因此请改用那个,它应该以相同的方式工作:

    class AddSettingsToUsers < ActiveRecord::Migration
      def self.up
        change_table :users do |t|
          t.text :signature
          ...
        end
      end
    
      ...
    
    end
    

    【讨论】:

      【解决方案2】:

      似乎只有 sqlite 是独一无二的

      yvaine:activerecord-2.3.5 root# find . -type f -exec grep -l alter_table {} \;
      

      ./lib/active_record/connection_adapters/sqlite_adapter.rb

      改用 change_column 方法可能更安全,因为它抽象了 alter table 方法。

      【讨论】:

        【解决方案3】:

        This 表明 Sqlite 适配器中有一个 alter_table 受保护的方法。

        【讨论】:

        • 嗯。为什么我可以直接调用它?这是我应该提交错误报告的疏忽吗?
        【解决方案4】:

        关于常规表达式操作,我有不同的 java 适配器到 sqlite 处理程序。 也许 rails 并没有完全统治适配器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-06
          • 2011-07-21
          • 1970-01-01
          • 1970-01-01
          • 2017-10-20
          • 2013-07-06
          • 2012-03-09
          • 1970-01-01
          相关资源
          最近更新 更多