class AutoSet::SetColumn

Public Class Methods

new(column, parents, options = {}) click to toggle source
# File lib/auto_set/set_column.rb, line 3
def initialize(column, parents, options = {})
  @column = column

  if parents.is_a? Hash
    @options = parents.reverse_merge from: :code
  else
    @options = options || {}
    @parents = parents
    @parents = @parents.is_a?(Array) ? @parents : [ @parents ]
  end
end

Public Instance Methods

before_create(record) click to toggle source
# File lib/auto_set/set_column.rb, line 24
def before_create(record)
  before_save record
end
before_save(record) click to toggle source
# File lib/auto_set/set_column.rb, line 15
def before_save(record)
  @record = record
  if @parents.present?
    direct
  else
    from_column
  end
end
before_validation(record) click to toggle source
# File lib/auto_set/set_column.rb, line 28
def before_validation(record)
  before_save record
end

Private Instance Methods

direct() click to toggle source
# File lib/auto_set/set_column.rb, line 34
def direct
  if @record.send(@column).blank?
    @record.send "#{@column}=", parent_object.send(@column)
  end
end
from_column() click to toggle source
# File lib/auto_set/set_column.rb, line 40
def from_column
  if @record.send("#{@column}_#{@options[:from]}_changed?")
    from_column_changed
  elsif @record.send("#{@column}_id_changed?")
    from_column_id_changed
  end
end
from_column_changed() click to toggle source
# File lib/auto_set/set_column.rb, line 64
def from_column_changed
  @record.send "#{@column}=", parent_from_column(@column, @options[:from])
end
from_column_id_changed() click to toggle source
# File lib/auto_set/set_column.rb, line 68
def from_column_id_changed
  value = @record.send(@column).code if @record.send(@column).present?
  @record.send "#{@column}_#{@options[:from]}=", value
end
parent_from_column(column, from) click to toggle source
# File lib/auto_set/set_column.rb, line 57
def parent_from_column(column, from)
  if @record.send("#{column}_#{from}").present?
    reflection = @record.class.reflections.with_indifferent_access[column]
    reflection.klass.where(from => @record.send("#{column}_#{from}")).first if reflection.present?
  end
end
parent_object() click to toggle source
# File lib/auto_set/set_column.rb, line 48
def parent_object
  parent = @record
  @parents.each do |parent_name|
    parent = parent.send(parent_name) if parent.respond_to? parent_name
  end

  parent
end