class WPDB::GravityForms::ModelGenerator
For each form that we have, define a class for accessing its leads. So, if you have a form called “User Registration”, we’ll define a class called UserRegistration, allowing you to do things like:
WPDB::GravityForms::UserRegistration.where(:date_registered => ‘2013-01-01’).each do { |l| puts “#{l.first_name} #{l.last_name}” }
All fields in the form are available as accessors.
Attributes
models[R]
Public Class Methods
new(forms = nil)
click to toggle source
# File lib/ruby-wpdb/gravityforms.rb, line 89 def initialize(forms = nil) @forms = Array(forms) || Form.all @models = [] end
Public Instance Methods
generate()
click to toggle source
# File lib/ruby-wpdb/gravityforms.rb, line 94 def generate @forms.each do |form| form_name = WPDB.camelize(form.title) form_class = build_class(form) @models << WPDB::GravityForms.const_set(form_name, form_class) end end
Private Instance Methods
build_class(form)
click to toggle source
Constructs a new Ruby class, inherited from Sequel::Model, that will hold our model-like functionality. Sequel gives us most of this for free, by virtue of defining a dataset.
# File lib/ruby-wpdb/gravityforms.rb, line 108 def build_class(form) @labels = [] dataset = WPDB.db[:"#{WPDB.prefix}rg_lead___l"] .where(:"l__form_id" => form.id) dataset = join_fields(dataset, form.fields) dataset = dataset.select_all(:l) dataset = select_fields(dataset, form.fields) dataset = dataset.from_self Class.new(Sequel::Model) do set_dataset dataset end end
ignored_fields()
click to toggle source
# File lib/ruby-wpdb/gravityforms.rb, line 143 def ignored_fields ["html_block"] end
join_fields(dataset, fields)
click to toggle source
# File lib/ruby-wpdb/gravityforms.rb, line 147 def join_fields(dataset, fields) fields.each_with_index do |field, i| next unless field && field['label'] next if ignored_fields.include?(field['label']) dataset = dataset.join_table( :left, :"#{WPDB.prefix}rg_lead_detail___ld#{i}", { :field_number => field['id'], :lead_id => :"l__id" } ) end dataset end
sanitise_label(original_label)
click to toggle source
# File lib/ruby-wpdb/gravityforms.rb, line 124 def sanitise_label(original_label) @labels ||= [] original_label = original_label.to_s return "" unless original_label.length > 0 i = 1 label = WPDB.underscoreize(original_label) while @labels.include?(label) label = WPDB.underscoreize(original_label + i.to_s) i += 1 end @labels << label label end
select_fields(dataset, fields)
click to toggle source
# File lib/ruby-wpdb/gravityforms.rb, line 162 def select_fields(dataset, fields) fields.each_with_index do |field, i| next unless field && field['label'] next if ignored_fields.include?(field['label']) field_name = sanitise_label(field['label']) next if field_name.empty? dataset = dataset.select_append(:"ld#{i}__value___#{field_name}") end dataset end