Class: AnnotateRb::ModelAnnotator::UniqueConstraintAnnotation::AnnotationBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/annotate_rb/model_annotator/unique_constraint_annotation/annotation_builder.rb

Instance Method Summary collapse

Constructor Details

#initialize(model, options) ⇒ AnnotationBuilder

Returns a new instance of AnnotationBuilder.



7
8
9
10
# File 'lib/annotate_rb/model_annotator/unique_constraint_annotation/annotation_builder.rb', line 7

def initialize(model, options)
  @model = model
  @options = options
end

Instance Method Details

#buildObject



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/annotate_rb/model_annotator/unique_constraint_annotation/annotation_builder.rb', line 12

def build
  return Components::NilComponent.new if !@options[:show_unique_constraints]
  return Components::NilComponent.new unless @model.connection.respond_to?(:supports_unique_constraints?) &&
    @model.connection.supports_unique_constraints? && @model.connection.respond_to?(:unique_constraints)

  unique_constraints = @model.connection.unique_constraints(@model.table_name)
  return Components::NilComponent.new if unique_constraints.empty?

  max_size = unique_constraints.map { |unique_constraint| unique_constraint.name.size }.max + 1

  constraints = unique_constraints.sort_by(&:name).map do |unique_constraint|
    columns = Array(unique_constraint.column)
    details = "(#{columns.join(", ")})"
    if unique_constraint.deferrable
      details += " DEFERRABLE INITIALLY #{unique_constraint.deferrable.to_s.upcase}"
    end

    UniqueConstraintComponent.new(unique_constraint.name, details, max_size)
  end

  _annotation = Annotation.new(constraints)
end