簡體   English   中英

如何將 rails 中的 has_many / belongs_to 關系遷移到 has_and_belongs_to_many?

[英]How can I migrate a has_many / belongs_to relationship in rails to has_and_belongs_to_many?

我有一個現有的 rails 6 應用程序,其中有兩個模型:

class Reservation << ApplicationRecord
# ...
  has_many :charges
# ...
end
class Charge << ApplicationRecord
# ...
  belongs_to :reservation
# ...
end

我想將其重構為:

class Reservation << ApplicationRecord
# ...
  has_and_belongs_to_many :charges
# ...
end
class Charge << ApplicationRecord
# ...
  has_and_belongs_to_many :reservation
# ...
end

我想知道的是如何編寫遷移? 表中已有數據,因此我需要保留已設置預訂 ID 的現有費用並保留鏈接。

在這里要小心,如果出現錯誤,請確保您可以恢復,這樣您就不會丟失數據!

首先,您需要使用遷移創建連接表。 您可以使用以下命令從命令行創建遷移:

rails g migration create_charges_reservations

這應該在 db/migrate 中為您創建遷移模板,您將根據需要填充該模板,如下所示:

class CreateChargesReservations < ActiveRecord::Migration[6.0]
  def change
    create_table charges_reservations do |t|
      t.integer :charge_id
      t.integer :reservation_id
    end
  end
end

從命令行運行遷移:

rails db:migrate

現在加入 model:

# app/models/charges_reservation.rb
class ChargesReservation < ApplicationRecord
  belongs_to :charge
  belongs_to :reservation
end

現在您必須遷移現有數據,因此從 rails 控制台:

Charge.all.each{|c| ChargesReservation.create(charge_id: c.id, reservation_id:c.reservation_id)}

最后,如您在問題中指出的那樣,將關聯更改為 habtm 關聯

# charge.rb
has_and_belongs_to_many :reservations

#reservation.rb
has_and_belongs_to_many :charges

哦,一旦您確定一切正常,您可以通過另一個遷移刪除費用表中的 reservation_id 列。 這是您在銷毀數據時可能會產生問題的地方,因此請確保正確填充了連接表。

實際上,您也不再需要連接 model,它只是填充連接表的一種便捷方式。 所以你可以刪除charges_reservation.rb model。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM