【问题标题】:How do I run rails g model / rake db:migrate within my rails application如何在我的 rails 应用程序中运行 rails g model / rake db:migrate
【发布时间】:2014-12-10 22:02:48
【问题描述】:

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

SQLite3::BusyException: database is locked

该错误仅在我使用after_createafter_save 时出现,但在我使用before_createaround_create 时工作正常。

我的模特:

class Table < AbstractModel

     after_create :create_table

     protected

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

end

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    Rails 生成器不打算在 Rails 应用程序中运行。它们甚至都不是必需的。他们只是锦上添花。因此,您可以运行rails g model table &lt;attrs&gt;,而不是创建一个名为 Table 的文件,它会在模型​​中生成文件 table.rb 并使用您传递的任何属性生成迁移。

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

    顺便说一句,after_createTable 的各个实例的回调。所以当你调用Table.create({&lt;attrs&gt;}) 时,它会调用create_table,这不是你想要的。

    编辑:

    使用 after_commit 而不是 after_create 似乎可以解决 OP 的问题。

    【讨论】:

    • 谢谢@evanbikes 和@LuisMenjivar。每当我做Table.create({&lt;attrs&gt;}) 并且我希望它立即完成时,我确实想创建一个表和一个新模型,所以我的问题是为什么after_create 回调中的database is locked
    • 听起来您知道自己在做什么。 after_create 将在创建记录后但事务完成后触发。所以after_commit :create_table, on: :create 可能会解决你的锁定问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2011-01-10
      • 1970-01-01
      • 2016-11-19
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多