Rails迁移和列更改

时间:2011-04-06 14:50:26

标签: ruby-on-rails ruby-on-rails-3

使用sqlite3进行本地开发。 Prod DB是MySql。

拥有一个用于列更改的迁移文件。

class ChangeDateToOrders < ActiveRecord::Migration
  def self.up
    change_column(:orders, :closed_date, :datetime)
  end

  def self.down
    change_column(:orders, :closed_date, :date)
  end
end

错误说index name 'temp_index_altered_orders_on_closed_location_id_and_parent_company_id' on table 'altered_orders' is too long; the limit is 64 characters

知道sqlite对索引名称有限制,但是有解决方法吗?

EDIT 我使用的解决方法。

class ChangeDateToOrders < ActiveRecord::Migration
  def self.up
    remove_index(:orders, [:closed_location_id, :parent_company_id])
    change_column(:orders, :closed_date, :datetime)
    add_index(:orders, [:closed_location_id, :parent_company_id], :name => "add_index_to_orders_cli_pci")
  end

  def self.down
    remove_index(:orders, :name => "add_index_to_orders_cli_pci")
    change_column(:orders, :closed_date, :date)
    add_index(:orders, [:closed_location_id, :parent_company_id])
  end
end

2 个答案:

答案 0 :(得分:1)

就个人而言,我喜欢我的生产和开发环境尽可能匹配。它有助于避免陷阱。如果我正在部署MySQL,我也会用MySQL运行我的开发环境。此外,我对SQLite也不是很熟悉所以这种方法对我懒惰的方面很有吸引力 - 我只需要知道一个db的来龙去脉。

答案 1 :(得分:0)

你可以破解你的活动记录副本;添加以下

          opts[:name] = opts[:name][0..63] # can't be more than 64 chars long

$ GEM_HOME / gems / activerecord-3.2.9 / lib / active_record / connection_adapters / sqlite_adapter.rb的第535行(版本3.2.9)

这是一个黑客,但它可能会让你超越障碍。如果我有更多时间,我会考虑编写测试并向rails核心团队发送拉取请求。