Ruby on rails 变化有很多,也有很多

Ruby on rails 变化有很多,也有很多,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我有一个发票模型,有许多交易。我需要在不丢失当前数据的情况下,将关系从has\u many更改为has\u and\u belient\u to\u many,以便我可以将一笔交易(付款)与多张发票关联 我当前的模型结构: class Invoice has_many :transactions end class Transaction belongs_to :invoice end 在过去的几年里,我还没有看到大量的HABTM协会。通常,人们会继续指定整个关联图: c

我有一个
发票
模型,
有许多
交易
。我需要在不丢失当前数据的情况下,将关系从
has\u many
更改为
has\u and\u belient\u to\u many
,以便我可以将一笔交易(付款)与多张发票关联

我当前的模型结构:

class Invoice
    has_many :transactions

end


class Transaction
    belongs_to :invoice
end

在过去的几年里,我还没有看到大量的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

这将在中进一步描述(以及另一个示例迁移)。

您确定要使用HABTM而不是
has\u many:through
?@jvillian这几乎是一样的,对吗?除了连接表是我要创建的模型之外?我有几个其他模型使用这种结构,它工作得很好。我想,如果您将来可能需要在关联对象上存储什么数据,您可以保存另一个数据迁移,但是使用
有很多:通过
。就我个人而言,我从未使用过HABTM,但这只是我个人的喜好。说得好。然而,我相信OP的问题是关于迁移现有数据(我需要将关系从has_many更改为has_,并且在不丢失当前数据的情况下将_归属于_many)。@AaronBreckenridge如何将数据保存到
InvoiceTransaction
模型?假设我想在那里保存给定发票的金额。这似乎不是正确的位置(
amount
听起来像是交易的属性),但您只需在迁移中添加一个
amount
列。