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
endFollowing 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 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access