app/models/binda/repeater.rb in binda-0.0.6 vs app/models/binda/repeater.rb in binda-0.0.7

- old
+ new

@@ -1,39 +1,32 @@ module Binda class Repeater < ApplicationRecord - include ComponentModelHelper + include FieldableAssociations # Associations belongs_to :fieldable, polymorphic: true belongs_to :field_setting - # Fields Associations - # - # If you add a new field remember to update: - # - get_fieldables (see here below) - # - get_field_types (see here below) - # - component_params (app/controllers/binda/components_controller.rb) - has_many :texts, as: :fieldable, dependent: :delete_all - has_many :dates, as: :fieldable, dependent: :delete_all - has_many :galleries, as: :fieldable, dependent: :delete_all - has_many :assets, as: :fieldable, dependent: :delete_all - has_many :radios, as: :fieldable, dependent: :delete_all - has_many :selects, as: :fieldable, dependent: :delete_all - has_many :checkboxes, as: :fieldable, dependent: :delete_all - # Repeaters need destroy_all, not delete_all - has_many :repeaters, as: :fieldable, dependent: :destroy - - accepts_nested_attributes_for :texts, :dates, :assets, :galleries, :repeaters, :radios, :selects, :checkboxes, allow_destroy: true - # The following direct association is used to securely delete associated fields # Infact via `fieldable` the associated fields might not be deleted # as the fieldable_id is related to the `component` rather than the `field_setting` after_create :set_default_position + + # Set default position after create + # + # This methods ensure that every repeater instance has an explicit position. + # The latest repeater created gets the highest position number. + # + # @return [object] Repeater instance def set_default_position - position = self.fieldable.repeaters.find_all{ |r| r.field_setting_id == self.field_setting.id }.length + # apparently `self.fieldable != self.fieldable_type.constantize.find( self.fieldable_id )` + # as the former has always one repeater, the latter has all repeaters created so far + # that's way we use the longer version + instance = self.fieldable_type.constantize.find( self.fieldable_id ) + position = instance.repeaters.find_all{ |r| r.field_setting_id == self.field_setting.id }.length self.update_attribute 'position', position end end end