Module: FormatAlias::Base::ClassMethods

Defined in:
lib/format_alias/base.rb,
lib/format_alias/formatters/date_format.rb,
lib/format_alias/formatters/polymorphic_alias.rb

Instance Method Summary collapse

Instance Method Details

#date_format_alias(attr, format, *args) ⇒ Object



4
5
6
7
8
9
10
11
# File 'lib/format_alias/formatters/date_format.rb', line 4

def date_format_alias(attr, format, *args)
  format_alias(
    attr,
    proc { send(attr).strftime(format) unless send(attr).nil? },
    proc { |value| send(:"#{attr}=", (Time.parse(value, format) rescue nil)) },
    *args
  )
end

#format_alias(attr, getter, setter, *args) ⇒ Object



11
12
13
14
15
16
17
# File 'lib/format_alias/base.rb', line 11

def format_alias(attr, getter, setter, *args)
  options = args.extract_options!
  name = options.delete(:as) || "#{attr}_formatted"

  define_method name, &getter
  define_method "#{name}=", &setter
end

#polymorphic_alias(attr, *args) ⇒ Object

Raises:

  • (ArgumentError)


4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/format_alias/formatters/polymorphic_alias.rb', line 4

def polymorphic_alias(attr, *args)
  options = args.extract_options!
  polymorphic = options.delete(:polymorphic) || true
  attrs = options.delete(:attrs)
  delim = options.delete(:delimiter) || ':'

  raise ArgumentError, "Specify :polymorphic or :attrs option for polymorphic_alias :#{attr} in #{self.name}" if attrs.blank? && polymorphic.blank?

  if polymorphic
    attrs = ["#{attr}_type", "#{attr}_id"]
    options[:as] ||= "#{attr}_type_id"
  else
    options[:as] ||= "#{attr}_split"
  end

  format_alias(
    attr,
    proc {
      r = attrs.map { |a| send(a) }.compact
      r.present? ? r.join(delim) : nil
    },
    proc { |value|
      values = value.to_s.split(delim)
      h = Hash[attrs.zip(values)]
      h.map { |a, v| send("#{a}=", v) }
    },
    options
  )
end