0

次のモデルを破棄したい:

class Job < ActiveRecord::Base
  has_many :items
  validates :name, presence: true, uniqueness: true
end

これはアイテムモデルです

class Item < ActiveRecord::Base
  belongs_to :department
  belongs_to :job
  belongs_to :category
  validates :name, presence: true, uniqueness: true
end

私は私が使用するつもりであることを知っていますrails d model Job

job_idしかし、Itemモデルの列を削除する方法は? ですかdb:rollback?そして、すべてがきれいであることを確認する方法は? 他に何をすべきですか?

4

4 に答える 4

2

job_id他の列を破壊する可能性があるため、ダウン マイグレーションを実行して列を削除できるかどうかは、提供された情報から判断できません。ただし、job_id列を明示的に削除する新しい移行を作成できます。

# from command line
rails g migration RemoveJobIdFromItems

テーブルで削除する列を指定します。

def up
  remove_column :items, :job_id
end

移行を再度追加する場合は、削除をロールバックする down 移行を作成します。

def down
  add_column :items, :job_id, :integer
end

次にrake db:migrate、コマンドラインから実行します。列がitemsテーブルから削除されます。

最後に、モデルから関連付けを削除したことを確認してください。

# app/models/item.rb
class Item < ActiveRecord::Base
  belongs_to :department
  belongs_to :category
  validates :name, presence: true, uniqueness: true
end
于 2013-08-30T22:04:36.663 に答える
0

job_id 列にもインデックスを配置すると仮定すると、列を削除する前にそれを削除する必要があります。また、Rails 3.1+ を実行している場合は、up/down メソッドをスキップして、このような単純なものに変更メソッドを使用できます。それ以外の場合は、zeantsoi に完全に同意します。移行の場合:

def change
  remove_index :items, :job_id
  remove_column :items, :job_id
end

また、列にインデックスがない場合: 外部キーにインデックスを付けます。

于 2013-08-30T22:54:49.663 に答える
0

それがあなただけであり、Item テーブルのデータがなくても生きていける場合は、次のようになります。

  • rake db:rollbackJob テーブルと Item テーブルの両方を削除するには、2 回実行します。
  • を実行rails d model Jobして、ジョブ モデルと移行を削除します
  • アイテム移行ファイルを編集して、手動でbelongs_to :job行を削除します
  • そして最後rake db:migrateに物事を正常に戻すために

グループで作業する場合、job_id を追加した移行が既に実行されているかどうかがわからないため、これはより安全です。

  • を実行rails g migration remove_job_id_from_items job_id:integerして、Item テーブルから job_id を削除する移行を作成します
  • を実行rails g migration drop_items_tableしてテーブルを削除し、この移行を編集drop_table :jobして変更ブロックに追加します (以下の注を参照)
  • を実行rake db:migrateして、作成したばかりの 2 つの移行を進めます。
  • 最後に実行rails d model Job --skip-migrationしてモデルを破棄しますが、元の移行は残します

このようにすると、両方の移行がプロジェクトに永久に残りますが、互いにキャンセルされます。git では、前進のみを試みます。

(注: これにより「元に戻せない移行」が発生する可能性があり、この手順を実行するためのより良い方法がある場合があります。)

于 2013-08-30T22:31:07.737 に答える