cirandas.net

ref: master

app/models/concerns/acts_as_having_boxes.rb


 1
 2
 3
 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
33
34
35
36
37
module ActsAsHavingBoxes

  module ClassMethods
    def acts_as_having_boxes
      has_many :boxes, -> { order :position }, as: :owner, dependent: :destroy
      accepts_nested_attributes_for :boxes
      self.send(:include, ActsAsHavingBoxes)
    end
  end

  module BlockArray
    def find(id)
      select { |item| item.id == id.to_i }.first
    end
  end

  def blocks(reload = false)
    if (reload)
      @blocks = nil
    end
    if @blocks.nil?
      @blocks = boxes.includes(:blocks).inject([]) do |acc,obj|
        acc.concat(obj.blocks)
      end
      @blocks.send(:extend, BlockArray)
    end
    @blocks
  end

  # returns 3 unless the class table has a boxes_limit column. In that case
  # return the value of the column.
  def boxes_limit layout_template = nil
    layout_template ||= self.layout_template
    @boxes_limit ||= LayoutTemplate.find(layout_template).number_of_boxes || 3
  end

end