web-dev-qa-db-ja.com

1回の移行で複数の列を追加する

シナリオ:すでにDocumentモデルがあり、追加したい

  • パブリック
  • プライベート

1回の移行で複数の列。

これまでに検索して読んだ内容から、移行ファイルを編集するだけです。移行がすでに適用されている場合は、ロールバックして再度移行します。

  1. これは一般的なベストプラクティスですか、それともより良い方法がありますか?
  2. これがそれを行う方法である場合、その移行の適切な命名は何でしょうか?
16
Marius Butuc

移行をロールバックして再編集するのは、その移行がローカルであり、どのリポジトリにもプッシュされていない場合にのみ安全です。他の人が適用した移行を編集すると、問題が発生する可能性があります。

既存のテーブルに列を追加する最も安全な方法は、新しい移行を作成することです。

Rails g migration add_public_and_private_to_document public:string private:string

add_[column_names]_to_[model]命名規則を使用する場合、Railsは適切なテーブルを作成し、必要な移行を作成します。

詳細については、こちらをお読みください: http://guides.rubyonrails.org/migrations.html

61
Cam

@Camの方法は厳密です。移行の実行後に2つのことを更新する必要があることを除いて。

したがって、myappという既存のスキャフォールドがあり、そのスキャフォールドにさらにフィールドを追加したいとします。やるべき3つのこと。

追加するフィールドは次のとおりです。

=>

1)Rails g migration add_term_count_and_current_record_count_and_previous_record_count_to_myapp term_count:integer , current_record_count:integer , previous_record_count:integer

=>

2) Update views, example updating _form.html.rb

追加する必要がありました:

<div class="field">
    <%= f.label :current_record_count %><br>
    <%= f.number_field :current_record_count%>
  </div>

 <div class="field">
    <%= f.label :current_record_count %><br>
    <%= f.number_field :previouse_record_count%>
  </div>

  <div class="field">
    <%= f.label :term_count  %><br>
    <%= f.number_field :terminations_count %>
  </div>

=>

3) Update Controller : 

Railsの新しいバージョンには、ハッカーが任意の列フィールド値を渡さないようにするための強力なパラメーターと呼ばれるものがあります。簡単に言うと、メソッドを新しいフィールド名で更新してください。そうしないと、新しいフィールドが表示されません。 。

 # Never trust parameters from the scary internet, only allow the white list through.

def vendor_file_params
    params.require(:vendor_file).permit(:name, :run_date,  :term_count ,
    :current_record_count , :previous_record_count ,:comments)   
end
end
2
zee

次のようなコマンドを発行できます。

Rails g移行ドキュメントpublic:string private:string

0