通过 has_many 关系创建 has_one

Creating a has_one through a has_many relationship

我目前有一个 ProductSale 型号,销量 has_many。 销售也属于发票。

我的目标是通过 ProductSale 与销售的关联来访问发票。 (product_sale.invoice)

当前 ProductSale 型号如下:

class ProductSale < ApplicationRecord
    has_many :sales
    has_one :invoice, through: :sales
end

然而,我当前的错误是说这不能完成,因为 :through association is a collection,我理解。有什么办法可以做到这一点吗?

class Sale < ApplicationRecord
  belongs_to :invoice
 end

class Invoice < ApplicationRecord
  has_many :sales, inverse_of: :invoice, dependent: :destroy
end

怎么样:

class ProductSale < ApplicationRecord
  has_many :sales
  has_one :sale
  has_one :invoice, through: :sale
end

ProductSale 对象的所有销售额都具有相同的发票。您知道您可以只使用第一笔销售的发票,但协会不会知道所有销售都有相同的发票,因此您可以使用任何发票,例如第一张。

要使用 invoices 方法获取每张发票,您可以这样做:

class ProductSale < ApplicationRecord
    has_many :sales
    has_many :invoices, through: :sales
end

但是,如果您想要使用假设所有发票都相同的业务逻辑,则必须编写一个方法来实现该业务逻辑。

class ProductSale < ApplicationRecord
    has_many :sales

    def invoice
      sales.first&.invoice
    end
end

如果发票上的所有销售额都是 ProductSale 对象中的销售额,那么也许您应该重构如下。

class ProductSale < ApplicationRecord
    has_one :invoice
    delegate :sales, :to => :invoice, :prefix => false, :allow_nil => true
end

然后你既可以调用invoice方法获取发票,也可以调用sales方法获取ProductSale对象的发票上的所有销售额。