Uploaded image for project: 'Mongoid'
  1. Mongoid
  2. MONGOID-922

Add Mongoid::Field.option for custom field options

    • Type: Icon: Task Task
    • Resolution: Done
    • 12_01_17
    • Affects Version/s: None
    • Component/s: None
    • Labels:
      None

      This allows users of Mongoid to define custom field options, and execute
      handlers when that option is provided.

      A few use-cases spring to mind:

      Auto-validations

      It should be (fairly) trivial to implement field-level validations like
      DataMapper and ActiveRecord, with the most trivial example looking
      something like this.

      Mongoid::Field.option :required do |model, field, required|
      model.validates_presence_of field.name if required
      end

      Now the block will be executed whenever a field is defined that includes
      the key :required in its options:

      Person.field :name, required: true
      Person.field :age, required: false

      All options provided are still stored on the Field, which should also
      allow for a richer level of introspection:

      class Person
      def required_fields
      fields.select

      { |field| field.options[:required] }

      end
      end

      Mass Assignment

      Mongoid::Field.option :accessible do |model, field, accessible|
      model.attr_accessible field.name if accessible
      end

      Re-writing option values, and other uses

      1. Turn :alias => :city into :alias => [:city]
        Mongoid::Field.option :alias do |model, field|
        field.options[:aliases] = [*field.options.delete(:alias)]
        end

      Mongoid::Field.option :aliases do |model, field, aliases|
      aliases.each do |new_name|
      model.alias_attribute new_name, field.name
      end
      end

            Assignee:
            Unassigned Unassigned
            Reporter:
            bernerdschaefer Bernerd Schaefer
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: