20

私の Rails アプリには Web サイト クローラーがあり、クローラーが .NET の Rails イニシャライザーで使用する認証資格情報を読み込みますconfig/initializers。初期化子は、SiteLogin モデルのモデル メソッドを呼び出すことによって認証を読み込みます。

rake db:migrateモデル テーブルを作成するために実行するSiteLoginと、初期化子はデータベース テーブルが既に存在することを想定しているため、失敗します。イニシャライザのコードをコメント アウトし、移行を実行してテーブルを作成し、イニシャライザ コードのコメントを解除するだけで問題を心配する必要はありません。

問題は、私は Capistrano を使用して展開しています。これは、移行を実行するために初期化コードなしで最初に展開し、次に初期化コードを使用して再度展開する必要があることを意味します。これを行うためのより良い方法はありますか、それともこの場合の私のアプローチは完全に間違っています。

私のケースをよりよく説明するためのコードサンプルを次に示します。

# config/initializers/site_crawler_init.rb
SiteCrawler.setup do |config|
  config.hostname = "www.example.com"
end

# model/site_crawler.rb
class SiteCrawler
  ...
  class << self
    attr_accessor :configuration

    def setup
      self.configuration ||= Configuration.new
      yield(configuration)
    end
  end

  class Configuration

    attr_accessor :hostname, :login_credentials

    def initialize
      @login_credentials = SiteLogin.admin_user
      ...
    end
  end
end
4

2 に答える 2

19

おそらくより良い解決策ではありませんが、テーブルが存在するかどうかを確認できます:

if ActiveRecord::Base.connection.tables.include?('your_table_name')
  # your code goes here
end

ただし、保留中の移行が存在する可能性があるため、通常は十分ではありません。

ここで、レーキ タスクを実行しているかどうかを確認することもできます。

if ActiveRecord::Base.connection.tables.include?('your_table_name') and !defined?(::Rake)
  # your code goes here
end

また、rake タスクで実行されるため、テストを起動するときにまだ十分ではない可能性があるため、Rails 環境がテストされているかどうかを確認することもできます ( Rails.env.test?)。

于 2012-08-28T11:32:37.617 に答える
13

特定のrakeタスクを実行するときに、特定のイニシャライザ(delayed_jobテーブルが存在する必要がある遅延ジョブの場合)をスキップする必要があるという同様の問題がありました-このインスタンスdb:migrate.

Rakefile に以下を追加しました。

def running_tasks
  @running_tasks ||= Rake.application.top_level_tasks
end

def is_running_migration?
  running_tasks.include?("db:migrate")
end

そして、問題のある初期化子で次のようにします。

unless defined?(is_running_migration?) && is_running_migration?
  ... do whatever
end
于 2015-05-11T15:51:09.773 に答える