Module: ModelSubsets::ClassMethods

Defined in:
lib/model_subsets.rb

Instance Method Summary collapse

Instance Method Details

#fieldset(name, *args) ⇒ Object

Defines a fieldset

Examples:

Define fieldset :login including fields :username and :password

fieldset :login, :username, :password

Parameters:

  • name (Symbol)

    The fieldset name

  • *args (Array)

    Fields names

  • options (Hash)

    The fieldset options

Since:

  • 0.0.2



106
107
108
109
110
111
# File 'lib/model_subsets.rb', line 106

def fieldset name, *args
  options = args.last.is_a?(Hash) ? args.pop : {}

  @fieldsets     ||= {}
  @fieldsets[name] = { options: options, fields: args }
end

#subset(name, options = {}) ⇒ Object

Defines a subset If no fieldset is included, all defined fieldsets will be included by default If fieldsets are defined on an extended subset, parents fieldsets will be ignored

Examples:

Define subset :user, which is a person able to login

subset :user, extends: :person, with: :login, scopes: :users

Parameters:

  • name (Symbol)

    The subset name

  • options (Hash) (defaults to: {})

    The options to pass to the subset

Options Hash (options):

  • :template (Boolean)

    Whether subset is a template (only used as an extend)

  • :group (Symbol)

    Subset group name

  • :fieldsets (Symbol, Array)

    Explicit fieldsets list. Overrides default list (all or herited)

  • :scopes (Symbol, Array)

    The scopes in which subset will be included

  • :extends (Symbol, Array)

    Parent subsets

  • :add (Symbol, Array)

    Fieldsets to be added to default of herited fieldsets

  • :only (Symbol, Array)

    Filters fieldsets to remove fielsets not being in this list

  • :except (Symbol, Array)

    Filters fieldsets to remove fieldsets being in this list

Since:

  • 0.0.2



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/model_subsets.rb', line 133

def subset name, options = {}
  @subsets        ||= {}
  @subsets_scopes ||= {}

  options[:fieldsets] = [options[:fieldsets]] unless options[:fieldsets].blank? || options[:fieldsets].is_a?(Array)

  # Subset is an extension
  if options[:extends]
    # Force extends option to Array
    options[:extends] = [options[:extends]] unless options[:extends].is_a?(Array)
    options[:extends].each do |source_subset|
      next unless @subsets.has_key? source_subset
      source_options = @subsets[source_subset].clone
      source_options.delete :template
      options = source_options.merge options
      options[:scopes] = [source_options[:scopes], options[:scopes]].flatten.uniq if source_options[:scopes]
    end

  # Include all opt-out fieldsets by default
  elsif options[:fieldsets].blank?
    options[:fieldsets] = @fieldsets.reject{ |k,v| v[:options][:opt_in] }.keys
  end

  # Handle fieldsets restriction list
  if options[:only]
    options[:only] = [options[:only]] unless options[:only].is_a?(Array)
    options[:fieldsets] &= options[:only]
  end

  # Handle fieldsets exclusion list
  if options[:except]
    options[:except] = [options[:except]] unless options[:except].is_a?(Array)
    options[:fieldsets] -= options[:except]
  end

  # Handle additional fieldsets list
  if options[:add]
    options[:add] = [options[:add]] unless options[:add].is_a?(Array)
    options[:fieldsets] |= options[:add]
  end

  # Handle scopes
  options[:scopes] ||= []
  options[:scopes] = [options[:scopes]] unless options[:scopes].is_a?(Array)
  options[:scopes].each do |subset_scope|
    @subsets_scopes[subset_scope] ||= []
    @subsets_scopes[subset_scope] << name unless options[:template]
    if respond_to?(subset_scope)
      (class << self; self; end).class_eval %Q"remove_method :#{subset_scope}"
      scopes.delete subset_scope
    end
    scope subset_scope, where(:subset.in => @subsets_scopes[subset_scope])
  end

  # Cleanup
  options[:fieldsets] = options[:fieldsets].uniq & @fieldsets.keys
  options[:group]   ||= :default
  remove_options      = [:extends, :add, :only, :except]
  options             = options.clone
  options.delete_if{ |key, value| remove_options.include?(key) }

  # Register subset
  @subsets[name] = options
end

#subset_fields(name) ⇒ Object

Return subset fields list

Examples:

Get fields included in subset :user of model Person

Person.subset_fields :user
=> [ :name, :givenname, :username, :password ]

Since:

  • 0.0.1



209
210
211
212
213
214
215
216
217
218
# File 'lib/model_subsets.rb', line 209

def subset_fields name
  return unless subsets.has_key?(name) && subsets[name].has_key?(:fieldsets)
  subset_fields = []
  subsets[name][:fieldsets].each do |fieldset|
    fields   = @fieldsets[fieldset][:fields]
    fieldset = fields.is_a?(Array) ? fields : [fields]
    subset_fields |= fieldset
  end
  subset_fields.uniq
end

#subsetsHash

Return builded subsets

Returns:

  • (Hash)

Since:

  • 0.0.1



225
226
227
# File 'lib/model_subsets.rb', line 225

def subsets
  @subsets.reject{ |name, options| options[:template] }
end

#subsets_scope(name) ⇒ Array

Return subsets included of a subsets scope

Returns:

  • (Array)

Since:

  • 0.0.2



234
235
236
# File 'lib/model_subsets.rb', line 234

def subsets_scope name
  subsets_scopes[name] || []
end

#subsets_scopesArray

Return subsets scopes list

Returns:

  • (Array)

Since:

  • 0.0.2



243
244
245
# File 'lib/model_subsets.rb', line 243

def subsets_scopes
  @subsets_scopes
end