OK, also habe ich eine Frage darüber, wie man am besten ein Problem in Schienen löst. Ich werde zeigen, wie ich es gelöst habe, würde aber gerne ein Feedback zu diesem Ansatz haben und ob es etwas Besseres zu tun gibt.Beste Möglichkeit, Multi Table Vererbung zu lösen
Zu Beginn habe ich eine grundlegende E-Commerce-App mit Kunden, Zahlungsmethoden und Zahlungen.
Jetzt kann eine Zahlungsmethode von verschiedenen Arten sein, EG 'Streifen, Braintree, Paypal'. Dies sind alle Zahlungsmethoden, aber sie haben eine sehr unterschiedliche Logik, um mit dem umzugehen, was sie tun.
Idealerweise möchte ich customer.payment_methods
anrufen und eine Beziehung der Zahlungsmethoden erhalten. Ich möchte auch customer.stripe_payment_methods
anrufen können und nur die Stripe-Methoden bekommen.
Ich dachte ursprünglich an die Verwendung und STI-Modell, aber das scheint ineffizient, da jede Zahlungsmethode unterschiedliche Spalten hat, auf die es ankommt.
Es erscheint verschwenderisch, ein Typfeld in der Tabelle speichern zu müssen.
Hier sind die relevanten Modelle
class PaymentMethod
scope :stripe, -> {where(type: 'PaymentMethod::Stripe')}
scope :paypal, -> {where(type: 'PaymentMethod::Paypal')}
# Lists available payment types
def self.available_types
PaymentMethod.subclasses.map { |d| [d::NAME, d.to_s] }
end
end
class PaymentMethod::Stripe < PaymentMethod
#performs Stripe specific methods
end
class PaymentMethod::Paypal < PaymentMethod
#performs Paypal specific actions.
end
Diese verwenden alle die payment_methods
Tabelle. Das funktioniert so, wie ich es mir vorgestellt habe, aber es fühlt sich schlampig an.
Gibt es einen besseren Weg, dies zu tun?