Ruby on rails 如何在rails应用程序中运行rails g model/rake db:migrate

Ruby on rails 如何在rails应用程序中运行rails g model/rake db:migrate,ruby-on-rails,Ruby On Rails,我想在我的rails应用程序中运行“rails g模型”和/或“rake db:migrate”。 当我这样做的时候,“rails g模型”工作得很好,但需要很长时间, “rake db:migrate”引发了一个错误 SQLite3::BusyException: database is locked 只有在创建后使用和保存后使用时才会出现错误,但在创建前使用或在创建前后使用时效果良好 我的模型: class Table < AbstractModel after_crea

我想在我的rails应用程序中运行“rails g模型”和/或“rake db:migrate”。 当我这样做的时候,“rails g模型”工作得很好,但需要很长时间, “rake db:migrate”引发了一个错误

SQLite3::BusyException: database is locked
只有在创建后使用
和保存后使用
时才会出现错误,但在创建前使用
或在创建前后使用
时效果良好

我的模型:

class Table < AbstractModel

     after_create :create_table

     protected

     def create_table
         system("rails g model #{self.name}")
         system("rake db:migrate")
     end

end
类表
Rails生成器不能在Rails应用程序中运行。它们甚至不是真的必要。他们只是很好的拥有。因此,您可以运行
rails g model Table
,而不是创建一个名为Table的文件,它将在模型中生成文件Table.rb,并使用您传递的任何属性生成迁移

迁移也不应该在应用程序代码中运行。您几乎必须手动或使用部署脚本来管理它们

另一方面,
after_create
是对
表的各个实例的回调。因此,当您调用
Table.create({})
时,它将调用
create\u Table
,这不是您想要的

编辑:


在提交后使用
而不是在创建后使用
似乎可以解决OP的问题。

您想实现什么?。正如evanbikes所说,您的设置方式是,每次创建表的实例时,都将生成一个新模型。您可以使用cron作业按计划运行rake任务。如果您使用的是heroku,那么您可以使用Herome scheduler。希望有帮助。

谢谢,@evanbikes和@LuisMenjivar。每当我做
table时,我确实想创建一个表和一个新模型。创建({})
并且我想立即完成,所以我的问题是,为什么
数据库在创建
回调后被锁定在
中?听起来你知道你在做什么<代码>创建后
将在创建记录后但在事务完成之前触发。因此,
在提交:创建表之后,on::create
可能会解决锁定问题。