gpt4 book ai didi

ruby-on-rails - 多态关系 vs STI vs 具有 RoR 的类表继承

转载 作者:行者123 更新时间:2023-12-04 03:51:58 24 4
gpt4 key购买 nike

有以下三种类型的发票项目

1) 订阅项目 ,

2) 按比例分配 ,

3) UsageItems ,

那些具有以下相同的属性

invoice_id
amount
stripe_invoie_id

然而

只有 订阅项目 按比例分配
period_start_at
period_end_at

并且只有 按比例分配 用法项目
title

并且只有 用法项目
uuid
account_id
description

为了实现这个模型,我一直在使用多态关系。
class InvoiceItem < ActiveRecord::Base
belongs_to :invoice
belongs_to :itemable, polymorphic: true
end

class SubscriptionItem < ActiveRecord::Base
belongs_to :plan
has_one :invoice_item, as: :itemable
end

class UsageItem < ActiveRecord::Base
belongs_to :account
has_one :invoice_item, as: :itemable
end

class Invoice < ActiveRecord::Base
belongs_to :account
has_many :invoice_items
end

class Account < ActiveRecord::Base
has_many :invoices
has_many :usage_items
end

现在它有效。
但是据我了解多态应该有 has_many关系。
所以这位于 Polymorphic 的中间和 STI .
因为这三种发票项目是 总是 是订阅项目、按比例分配或使用项目。

很难决定我可以继续使用这个模型(多态与 has_one )还是我应该改用 STI?
还是类表继承应该合适?

编辑

我很想听听我可以使用一些设计的原因。
也许那些类型 优点 缺点 .

据我所知,

如果我申请 STI

That leads many NULLable columns, but RoR supports STI. So it's easy to use.



如果我用 has_one 应用多态

It stills the rails way but the original polymorphic definition is different. It should have has_many relationship instead of has_one. Also it's impossible to add foreign key.



引用: Blog post for STI to polymorphic

如果我应用类表继承,

It's more efficient for relational database, but it's not rails way.



引用: Blog post for STI to class table inheritance

最佳答案

我认为带有 h​​idden_​​field 的 STI 为每个应该确定发票类型的属性传递适当的值,可能是这里的方法。它是 简单高效。

假设您添加了一个名为 :invoice_type 的字段到您的发票模型,

然后只需循环遍历数组中的项目,例如(粗略示例):

<% @invoices.where(:invoice_type => "proration").find_each do |invoice| %>
<% @invoices.where(:start_date => "#{@invoice.start_date}").find_each do |invoice| %>
<!--Will only show the start_date of invoices where the invoice_type is propration. -->
<% end %>
<% end %>

关于ruby-on-rails - 多态关系 vs STI vs 具有 RoR 的类表继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42177095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com