【问题标题】:How do i correctly implement a three way many-to-many relationship in rails 4?如何在 Rails 4 中正确实现三向多对多关系?
【发布时间】:2017-10-25 17:36:17
【问题描述】:

我正在使用 rails 4,并且可能存在如下所示的三向多对多关系情况:要注册销售,我需要一个客户和一个产品,以及它的数量。当我因为另一个表分期付款需要一个固定的销售 ID 时,三路出现,每期付款的到期日期和值,并检查它们是否已付款。

我对它们之间的关系有些困惑,但我做了这样的事情(我将这里用作 SCP 的中间表称为 sale_client_product):

class Client < ActiveRecord::Base
  has_many :scps
end

class Sale < ActiveRecord::Base
  has_many :scps
  has_many :installments
end

class Installment < ActiveRecord::Base
  belongs_to :sale
end

class Product < ActiveRecord::Base
  has_many :scps
end

class SCP < ActiveRecord::Base
  belongs_to :client
  belongs_to :product
  belongs_to :sale
end

我想知道这是否正确,或者是否有更好的方法。我在实际保存时也处于一个图片中,至于任何一次销售,我可能必须用一种形式保存许多 SCP 实例。

【问题讨论】:

    标签: ruby-on-rails forms many-to-many


    【解决方案1】:

    如果您想在单个文档中包含ProductClientSaleInstallment 信息,也许您可​​以使用Invoice

    在业务中,如果公司想向客户要钱,他会定期向他发送invoice,其中包含以下所有信息:

    • 每件商品的详细信息、名称、数量、价格
    • 客户详细信息、姓名、地址、电话号码
    • 销售明细、总价、销售日期分期到期日、分期金额

    Class Client
      has_many :invoices
    end
    
    Class Product
      has_many :invoices
    end
    
    Class Sale
      has_many :installments
      has_many :invoices, through: :installments 
    end
    
    Class Installment
      belongs_to :sale
    end
    
    Class Invoice
      belongs_to :client
      belongs_to :product
      belongs_to :installment
    end
    

    Payment 将是您与Invoice 核对的内容,以便您了解哪些Invoices(以及随后的Installments)被支付了。

    Class Payment
      belongs_to :invoice
    end
    

    当您执行@invoice.payment 时,您会收到该发票的付款(belongs_to :installment),如果@invoice.paymentnil,则未支付分期付款。

    如果你想注册一个Payment,它应该有一个现有的Invoice

    @payment = Payment.new(payment_params)
    @payment.invoice_id = @invoice.id
    @payment.save
    

    这就是我在会计领域工作时注册会计交易的方式。随时改进您的应用,也许将来我们可以编辑这篇文章以进行改进

    一个可能的改进可能是建立Installment has_one :payment, through: :invoice,所以你想办法!

    【讨论】:

    • 感谢您的帮助。我仍然需要更好地理解多态关联,因为我不知道它是如何工作的,当我让它工作时我会回复你
    • 我明白了,您是否将此发票视为包含特定销售和客户的所有产品的包裹?我无法理解您的示例的实现,因为我不知道什么发票是代码明智的。
    • @onildo 你是对的。我的解决方案不完整,所以我完全重写了它。请看一看。谢谢
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多