我想运行" rails g model"和/或" rake db:migrate"在我的rails应用程序中。 当我这样做时," rails g model"工作正常,但需要很长时间, 和" rake db:migrate"提出错误
SQLite3::BusyException: database is locked
只有在我使用after_create
和after_save
时才会出现错误,但在使用before_create
或around_create
时效果正常。
我的模特:
class Table < AbstractModel
after_create :create_table
protected
def create_table
system("rails g model #{self.name}")
system("rake db:migrate")
end
end
答案 0 :(得分:1)
Rails生成器不适合在Rails应用程序中运行。它们甚至都不是必需的。他们只是很有趣。因此,您可以运行rails g model table <attrs>
而不是创建名为Table的文件,它将在模型中生成文件table.rb,并使用您传递的任何attrs生成迁移。
迁移也不应该在应用程序代码中运行。您几乎必须手动或使用部署脚本来管理它们。
另外,after_create
是Table
个别实例的回调。因此,当您致电Table.create({<attrs>})
时,它会拨打create_table
,这不是您想要的。
编辑:
使用after_commit
而非after_create
似乎解决了OP的问题。
答案 1 :(得分:1)
你想要完成什么?正如evanbikes所说,您设置的方式是每次创建表的实例时,您将生成一个新模型。您可以使用cron作业按计划运行rake任务。如果您使用的是heroku,则可以使用英雄调度程序。希望它有所帮助。