Create a Module for Zuora Custom Fields
Background
In a recent review (shown below), @vitallium gave a suggestion for wrapping common logic for Zuora Custom Fields into a module which could easily be included in Zuora::
models.
Follow-up details
The following discussion from !9608 should be addressed:
-
@vitallium started a discussion: (+1 comment) suggestion (completely optional :D): Since we rely on custom fields a lot, I wonder if we can make their DX a bit more convenient and ensure if a custom field acts as a boolean, we can query it as conditional method in Ruby:
eoa_starter_bronze_offer_accepted?
. I think we can write a small concern for that:module Zuora module CustomFields extend ActiveSupport::Concern included do def self.custom_field(name, type:) field_name = "#{name}__c" define_method(name) do read_attribute(field_name) end define_method(:"#{name}=") do |value| write_attribute(field_name, value) end if type == :boolean define_method(:"#{name}?") do !!read_attribute(field_name) end end end end end end
Then we can use it in our ActiveRecord model:
class Subscription < ApplicationRecord include Zuora::CustomFields custom_field :eoa_starter_bronze_offer_accepted, type: :boolean end
Which gives us a nice way to use them:
=> Zuora::Subscription.new.eoa_starter_bronze_offer_accepted? false => Zuora::Subscription.new(eoa_starter_bronze_offer_accepted: true).eoa_starter_bronze_offer_accepted? true
With that concern we can use common boolean types in our database instead of
string
to improve performance and DX. Totally fine if we do that in a follow-up, just sharing it here with you.