Rails 3在所有环境中保持单个表相同

时间:2011-07-19 17:23:01

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

我有一些需要在线编辑的数据(即不能是种子),但在所有环境中也需要相同。到目前为止,我发现的唯一的东西是has_alter_ego宝石,但它似乎不再受支持了。

示例:

  
      
  • 我对开发数据库中的default_settings表做了很多更改

  •   
  • 我想将这些更改从我的开发转移到生产数据库(而不是其他包含测试数据的表)

  •   
  • 除非有办法从网上编辑种子,否则我宁愿不使用种子

  •   

我正在考虑的一个选项是拥有一个单独的数据库。

任何人都有这个问题的干净解决方案吗?谢谢!

2 个答案:

答案 0 :(得分:1)

如何定义第二个sqlite3数据库,该数据库仅在此表中使用您的应用程序签入,并将其用于所有三种环境?例如,sqlite3文件可以命名为other_db.sqlite3:

配置/ database.yml中:

... (your other settings for dev, test, and prod databases)

other_db:
  database: db/other_db.sqlite3
  adapter: sqlite3
  timeout: 5000

应用程序/模型/ external.rb:

class External < ActiveRecord::Base
  self.abstract_class = true
  establish_connection :other_db  
end

应用程序/模型/ cross_environment_data.rb

class CrossEnvironmentData < External
  ...
end

答案 1 :(得分:0)

在这种情况下(虽然完全不鼓励),我会把它放在迁移中。

/db/migrate/_edit_data.rb

class EditData < ActiveRecord::Migration
  def self.up
    <Do your edits here>
  end

  def self.down
    <undo edits here>
  end
end

然后:

rake db:migrate

现在,您在所有环境中拥有相同的数据。

例如,如果您想在Post.text的所有记录中将一些文本附加到一大块文本的末尾。

script/generate migration append_text

/db/migrate/_append_text.rb

class AppendText < ActiveRecord::Migration
  def self.up
    Post.each{ |p| p.update_attribute(:text, "#{p.text} my additional text")}
  end

  def self.down
    raise ActiveRecord::IrreversibleMigration
  end
end

当你跑步时:

rake db:migrate

在开发时,更改将相应地传播,当您部署到其他环境时,您将必须运行相同的命令,他们将收到相同的更改。这更像是一次不可逆转的迁移,因为您无法验证自迁移之后数据是否发生了变化,因此请确保这是您要执行的操作(在dev上运行)=)

新解决方案:

https://github.com/ricardochimal/taps

如果要传输表格列表

$ taps push postgres://dbuser:dbpassword@localhost/dbname http://httpuser:httppassword@example.com:5000 --tables logs,tags