通过 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
对象的发票上的所有销售额。
我目前有一个 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
对象的发票上的所有销售额。