Rails 5 - 在rake任务中生成并运行迁移

时间:2017-07-28 23:43:59

标签: ruby-on-rails rake ruby-on-rails-5

所以我有一个应用程序,当我创建一个新用户时,我在与该特定用户相关的其他一些数据库中设置了列。我意识到这不是最好的做法,但对于我的用例,它比序列化一个包含该表的所有用户信息的数组要快得多。

我要做的是设置一个rake任务,创建User,并对表进行必要的迁移。

这是我到目前为止所拥有的:

  desc "Adds User and creates correct DB entries."
  task add_user: :environment do
    username = ENV['username'].to_s
    email = ENV['email'].to_s
    password = ENV['password'].to_s
    initials = ENV['initials'].to_s
    if username and email and password and initials
      User.create! :username => username, :email => email, :password => password, :password_confirmation => password, :initials => initials
      Rake::Task['generate migration AddPay' + initials + 'ToShoppingLists pay' + initials + ':decimal'].invoke
      Rake::Task['generate migration AddPay' + initials + 'ToPayments pay' + initials + ':decimal'].invoke
      Rake::Task['db:migrate'].invoke
    end
  end

我的问题是,在Rails 5中,我必须运行rails g migration而不是rake g migration,因此我不确定如何从{{1}内调用rails命令1}}任务。

此外,有没有办法检查是否已创建迁移?例如,如果我在开发模式下运行它,我不需要在生产模式下重新创建迁移,只需执行rake

1 个答案:

答案 0 :(得分:1)

您可以使用Rake的{​​{1}}方法,只需调用sh shell命令。

rails

使用sh "rails g migration AddPay#{initials}ToShoppingLists pay#{initials}:decimal" sh "rails g migration AddPay#{initials}ToPayments pay#{initials}:decimal" 而不是ruby的内置反引号分隔符用于shell命令时,如果命令的退出状态不是sh,则会引发异常并中止任务。

要查看您的迁移是否已创建,您只需检查是否存在与命名模式匹配的迁移文件。

0

这假设您不会在files = Dir.glob Rails.root.join('db/migrate/*') migration_patterns = { /add_pay_#{initials.downcase}_to_shopping_lists/ => "rails g migration AddPay#{initials}ToShoppingLists pay#{initials}:decimal", /add_pay_#{initials.downcase}_to_payments/ => "rails g migration AddPay#{initials}ToPayments pay#{initials}:decimal" } migration_patterns.each do |file_pattern, migration_command| if files.none? { |file| file.match? file_pattern } sh migration_command end end Rake::Task['db:migrate'].invoke 中发生任何导致误报的迁移命名冲突。但是Rails不会让你有迁移命名冲突,所以检查可能没有必要。考虑到您命名迁移和列的方式,您似乎最终会遇到此问题。如果两个用户具有相同的首字母,该怎么办?

有没有办法可以通过使用额外的数据库表(可能是多态连接表?)而不是为每个none?添加列来完成所需的操作?这些方面的东西可以起作用:

user