Strategy Pattern with Domain Tables
Another use of domain tables, when the number of records is tractable enough to be represented in code, is to point to collections of methods or data contained in classes, much as a trigger for the Gang of Four strategy pattern.
We will explore this idea with the payment types found in the
orders
table. We begin with the
standard domain table refactoring performed earlier. Then, we’ll enhance
our solution by making use of ActiveRecord’s single table inheritance,
to achieve the Domain Table Strategy Pattern. We start out with our
initial cut at the Order
class,
before we create the domain table for payment types. It looks very
similar to our initial Ratings
class, with an array containing
the acceptable payment types to match the database constraint:
class Order < ActiveRecord::Base belongs_to :movie_showtime_id validates_uniqueness_of :confirmation_code validates_presence_of :confirmation_code, :purchaser_name, :payment_type, :credit_card_number, :credit_expiration_month, :credit_expiration_year PAYMENT_TYPES = ['Visa', 'MasterCard', 'American Express'] def validate_payment_type unless PAYMENT_TYPES.include?(payment_type) errors.add('payment_type', "must be #{PAYMENT_TYPES[0..-2].join(', ')} or #{PAYMENT_TYPES[-1]}") end def validate validate_payment_type end end
Following the ratings example, we factor out the payment type into
its own table, payment_types
, and we
insert the appropriate data for our domain of credit card processing:
create sequence ...
Get Enterprise Rails now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.