Ruby on rails 从控制器/助手、Ruby on Rails重置数据库

Ruby on rails 从控制器/助手、Ruby on Rails重置数据库,ruby-on-rails,ruby,postgresql,ruby-on-rails-4,Ruby On Rails,Ruby,Postgresql,Ruby On Rails 4,我已经创建了我的程序的演示。演示用于向客户演示程序。在每次演示之前,我想重置数据库并插入某些数据,我必须执行的操作有: rake db:drop rake db:setup rake db:seed:demo 但他们并不总是让我来演示,其他人也不使用控制台,所以我想在设置页面中添加通过按钮重置的功能 我试着这样做: module SettingsHelper require 'rake' def reset Rake::Task[db:drop].invoke

我已经创建了我的程序的演示。演示用于向客户演示程序。在每次演示之前,我想重置数据库并插入某些数据,我必须执行的操作有:

rake db:drop
rake db:setup
rake db:seed:demo
但他们并不总是让我来演示,其他人也不使用控制台,所以我想在设置页面中添加通过按钮重置的功能

我试着这样做:

module SettingsHelper
require 'rake'
  def reset
        Rake::Task[db:drop].invoke
        Rake::Task[db:setup].invoke
        Rake::Task[db:seeds:demo].invoke
  end
end
我填写以下表格:

  <%=button_to "Reset", reset, class:"btn red" %>

但是我不能用活动服务器删除数据库。。。我该怎么做?

我从下面的答案中提取了一些代码

您可以在控制器中添加类似的内容

def reset_db
  conn = ActiveRecord::Base.connection
  tables = ActiveRecord::Base.connection.tables
  tables.each { |t| conn.execute("TRUNCATE #{t}") }

  Rails.application.load_seed
end

我从下面的答案中提取了一些代码

您可以在控制器中添加类似的内容

def reset_db
  conn = ActiveRecord::Base.connection
  tables = ActiveRecord::Base.connection.tables
  tables.each { |t| conn.execute("TRUNCATE #{t}") }

  Rails.application.load_seed
end

当您有活动连接时,不能删除数据库。相反,您可以执行的是发出TRUNCATE命令,从表中删除所有行并重置ID列

如果您想要更细粒度地控制哪些表被截断,可以向模型中添加一个类方法:

class User < ActiveRecord::Base
  self.truncate!
    self.connection.execute(
      "TRUNCATE TABLE #{ self.table_name };"
    )
    self.connection.reset_pk_sequence!(self.table_name)
  end
end 
如果您只想对所有表格进行核爆,只需执行以下操作:

ActiveRecord::Base.connection.tables.each do |t|
  conn = ActiveRecord::Base.connection
  conn.execute("TRUNCATE TABLE #{t} CASCADE;")
  conn.reset_pk_sequence!(t)
end

当您有活动连接时,不能删除数据库。相反,您可以执行的是发出TRUNCATE命令,从表中删除所有行并重置ID列

如果您想要更细粒度地控制哪些表被截断,可以向模型中添加一个类方法:

class User < ActiveRecord::Base
  self.truncate!
    self.connection.execute(
      "TRUNCATE TABLE #{ self.table_name };"
    )
    self.connection.reset_pk_sequence!(self.table_name)
  end
end 
如果您只想对所有表格进行核爆,只需执行以下操作:

ActiveRecord::Base.connection.tables.each do |t|
  conn = ActiveRecord::Base.connection
  conn.execute("TRUNCATE TABLE #{t} CASCADE;")
  conn.reset_pk_sequence!(t)
end


如果有活动连接,则无法删除数据库。你能做的是销毁所有记录并创建新记录OK,我如何调用种子来创建记录?Rails.application.load\u seed如果你有活动连接,你不能删除数据库。您可以做的是销毁所有记录并创建新记录OK,我如何调用种子来创建记录?Rails.application.load\u seed谢谢这是一个好主意,但我有一个问题,因为我使用的是Postgresql,id不总是从1开始,否则种子中的关系不起作用。。。如何设置第一个id 1?我想这是一个名为“sequence”的函数。我尝试了这个功能,但它给了我一个错误:PG::UndefinedObject:错误:无法识别的配置参数表:show tables in postgres它的SELECT tablename FROM PG_tables,但是你也可以使用适配器提供的更高级别的ActiveRecord::Base.connection.tables。@Deepak是康涅狄格州对吗?因为我在“Edited”中得到了未定义的局部变量或方法conn的错误,您需要连接tanks这是一个好主意,但我有一个问题,因为我使用的是Postgresql,id不总是从1开始,否则种子中的关系不起作用。。。如何设置第一个id 1?我想这是一个名为“sequence”的函数。我尝试了这个功能,但它给了我一个错误:PG::UndefinedObject:错误:无法识别的配置参数表:show tables in postgres它的SELECT tablename FROM PG_tables,但是你也可以使用适配器提供的更高级别的ActiveRecord::Base.connection.tables。@Deepak是康涅狄格州对吗?因为我在“Edited”中得到了未定义的局部变量或方法conn的错误,所以您需要连接控件。。。CASCADE是一种特定于Postgres的方法,即使存在外键约束也可以截断表。我在控制器中包含了“Resetable”,并将函数放在“helper”中,我遇到了以下错误:“undefined method truncate!”因为变量模型是Student,我通过的第一个模型modules和helpers不是一回事。上面是一个混合到模型类中以扩展它的模块。控制器中混入了一个助手,这不是您想要的。您应该在学生类中包括Resetable。请按照答案中的示例进行操作。截断。。。CASCADE是一种特定于Postgres的方法,即使存在外键约束也可以截断表。我在控制器中包含了“Resetable”,并将函数放在“helper”中,我遇到了以下错误:“undefined method truncate!”因为变量模型是Student,我通过的第一个模型modules和helpers不是一回事。上面是一个混合到模型类中以扩展它的模块。控制器中混入了一个助手,这不是您想要的。您应该在学生类中包括Resetable。按照答案中的例子来做。