将has_many更改为has_and_belongs_to_many

时间:2018-08-15 20:53:41

标签: ruby-on-rails ruby ruby-on-rails-5

我有一个Invoice has_many的{​​{1}}模型。我需要将关系从Transactions更改为has_many,而又不丢失当前数据,以便可以将单笔交易(付款)与多张发票相关联。

我当前的模型结构:

has_and_belongs_to_many

1 个答案:

答案 0 :(得分:1)

在过去几年中,我还没有看到大量的HABTM协会。通常人们会先指定整个关联图:

class Invoice
  has_many :invoice_transactions
  has_many :transactions, through: :invoice_transactions
end

class InvoiceTransaction
  belongs_to :invoice
  belongs_to :transaction
end

class Transaction
  has_many :invoice_transactions
  has_many :invoices, through: :invoice_transactions
end

# in a migration
create_table :invoice_transactions do |t|
  t.belongs_to :invoice
  t.belongs_to :transaction
end
execute('INSERT INTO invoice_transactions VALUES (invoice_id, transaction_id) FROM (SELECT id, transaction_id FROM invoices)')

这是因为InvoiceTransaction可能会获得一些其他行为,但这只是(很少)投机编程(并且可能值得这样做)。

您所要求的完全可以通过以下方式实现:

class Transaction
  has_any_belongs_to_many :invoices
end

class Invoice
  has_and_belongs_to_many :transactions
end

rails guides中将对此进行进一步描述(以及另一个示例迁移)。