1

すでにデプロイされているアプリケーションでは、私seeds.rbの中には次のものがあります。

State.create!(:state => "Alabama")
State.create!(:state => "Delaware")
...

次に、州ごとに2文字のコードを追加したいと思いました。

だから私はこのような移行をしました:

class AddStateCodeToStates < ActiveRecord::Migration
  def self.up
    add_column :states, :state_code, :string

    update(<<-SQL
    UPDATE states SET state_code='WA' where state = 'Washington'
    SQL
    )
    ...lots of these SQL statement...
  end

  def self.down
  end
end

問題は次のとおりです。

開発環境で、データベースを最初から再作成する場合、移行の実行後、その時点でseeds.rbはまだ実行されていません。

したがって、UPDATE xxx移行中のにAddStateCodeToStatesは、処理するデータがありません(statesデータはから入力されるため、テーブルは空ですseeds.rb)。したがって、はstate_code残りNULLます。

だから私の質問は次のとおりです(それらはとても関連しているので、それぞれの別々の質問としてそれらを尋ねないことをお詫びします):

  1. state_codesデータベースを再作成するとき(statesテーブルにデータが含まれた後)にデータを入力するにはどうすればよいですか?
  2. デプロイされたアプリでstate_codesいつ取得するか(で実行されない)rake db:migrateseeds.rbrake db:migrate
  3. そもそも使用すべきではありませんでしたかseeds.rb(代わりにデータを移行に入れるべきでしたか)?
4

1 に答える 1

3

Railsの多くのものと同様に、多くのオプションがありますが、一般的な方法は、必要なアプリケーションデータをに入れることですseeds.rb。余分なレコードを追加せずに複数回実行できるようにseeds.rbを作成する必要があります。

State.find_or_create_by_state(:state => 'state_name_here', ':state_code => 'code here')

于 2011-05-24T19:03:36.613 に答える