Module: ImportableAttachments::Base::ClassMethods

Defined in:
lib/importable_attachments/base.rb

Instance Method Summary collapse

Instance Method Details

#has_importable_attachment(options) ⇒ Object

:call-seq: has_importable_attachment opts

opts

:import_method
:import_into
:spreadsheet_columns


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/importable_attachments/base.rb', line 12

def has_importable_attachment(options)
  lopt = {import_method: :import_rows}
  lopt.merge! options

  validate_importable_attachment_options lopt
  install_importable_attachment_options lopt
  install_importable_attachment_associations
  install_importable_attachment_validations
  install_importable_attachment_assignment_protection

  include InstanceMethods

  # for assigning attachment to new record
  after_create :import_attachment
end

#install_importable_attachment_assignment_protectionObject



70
71
72
73
74
# File 'lib/importable_attachments/base.rb', line 70

def install_importable_attachment_assignment_protection
  attr_accessible :attachment, :attachment_attributes, :attachment_id
  accepts_nested_attributes_for :attachment, :allow_destroy => true,
    :reject_if => :all_blank
end

#install_importable_attachment_associationsObject



45
46
47
48
49
50
# File 'lib/importable_attachments/base.rb', line 45

def install_importable_attachment_associations
  has_one :attachment, :dependent => :nullify, :as => :attachable
  delegate :io_stream, :to => :attachment, :prefix => true
  delegate :io_stream_url, :to => :attachment, :prefix => true
  delegate :io_stream_file_name, :to => :attachment, :prefix => true
end

#install_importable_attachment_options(options) ⇒ Object



38
39
40
41
42
43
# File 'lib/importable_attachments/base.rb', line 38

def install_importable_attachment_options(options)
  [:import_method, :import_into, :spreadsheet_columns].each do |sym|
    cattr_accessor sym
    self.send("#{sym}=".to_sym, options[sym])
  end
end

#install_importable_attachment_validationsObject



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/importable_attachments/base.rb', line 52

def install_importable_attachment_validations
  validates :attachment, :associated => true
  validate do |record|
    if @columns_not_found
      invalid_attachment_error "column(s) not found: #{@columns_not_found}"
    end
    if !@row_errors.blank?
      invalid_attachment_error "failed to import #{@row_errors.length} record(s)"
      @row_errors.each {|row| attachment.errors.add(:base, row)}
    end
  end

  # These go in the class calling has_importable_attachment as they are
  # dependent on mime-type expectations
  #validates_with CsvValidator, :if => Proc.new {|model| model.attachment.present?}
  #validates_with ExcelValidator, :if => Proc.new {|model| model.attachment.present?}
end

#validate_importable_attachment_options(options) ⇒ Object



28
29
30
31
32
33
34
35
36
# File 'lib/importable_attachments/base.rb', line 28

def validate_importable_attachment_options(options)
  [:spreadsheet_columns, :import_into].each do |sym|
    raise RuntimeError, "has_importable_attachment: needs :#{sym}" unless options.has_key? sym
  end

  unless options[:spreadsheet_columns].is_a?(Enumerable)
    raise RuntimeError, 'has_importable_attachment: :spreadsheet_columns must be Enumerable'
  end
end