Class: ActiveScaffold::DataStructures::NestedInfoAssociation

Inherits:
NestedInfo show all
Defined in:
lib/active_scaffold/data_structures/nested_info.rb

Instance Attribute Summary

Attributes inherited from NestedInfo

#association, #child_association, #constrained_fields, #param_name, #parent_id, #parent_model, #parent_scaffold, #scope

Instance Method Summary collapse

Methods inherited from NestedInfo

#belongs_to?, get, #habtm?, #has_many?, #has_one?, #new_instance?, #plural_association?, #readonly?, #singular_association?

Constructor Details

#initialize(model, params) ⇒ NestedInfoAssociation

Returns a new instance of NestedInfoAssociation.


76
77
78
79
80
81
82
83
84
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 76

def initialize(model, params)
  super
  column = parent_scaffold.active_scaffold_config.columns[params[:association].to_sym]
  @param_name = column.model.name.foreign_key.to_sym
  @parent_id = params[@param_name]
  @association = column&.association
  @child_association = association.reverse_association(model) if association
  setup_constrained_fields
end

Instance Method Details

#default_sorting(chain) ⇒ Object


119
120
121
122
123
124
125
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 119

def default_sorting(chain)
  return @default_sorting if defined? @default_sorting
  return unless association.scope.is_a?(Proc) && chain.respond_to?(:values) && chain.values[:order]
  @default_sorting = chain.values[:order]
  @default_sorting = @default_sorting.map(&:to_sql) if @default_sorting[0].is_a? Arel::Nodes::Node
  @default_sorting = @default_sorting.join(', ')
end

#match_model?(model) ⇒ Boolean

Returns:

  • (Boolean)

107
108
109
110
111
112
113
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 107

def match_model?(model)
  if association.polymorphic?
    child_association&.inverse_klass == model
  else
    association.klass == model
  end
end

#readonly_through_association?(columns) ⇒ Boolean

A through association with has_one or has_many as source association create cannot be called in nested through associations, and not-nested through associations unless is through singular or create columns include through reflection of reverse association e.g. customer -> networks -> firewall, reverse is firewall -> network -> customer, firewall can be created if create columns include network

Returns:

  • (Boolean)

93
94
95
96
97
98
99
100
101
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 93

def readonly_through_association?(columns)
  return false unless through_association?
  return true if association.through_reflection.options[:through] # create not possible, too many levels
  return true if association.source_reflection.options[:through] # create not possible, too many levels
  return false if association.through_singular? # create allowed, AS has code for this

  # create allowed only if through reflection in record to be created is included in create columns
  !child_association || !columns.include?(child_association.through_reflection.name)
end

#sorted?(chain) ⇒ Boolean

Returns:

  • (Boolean)

115
116
117
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 115

def sorted?(chain)
  default_sorting(chain).present?
end

#through_association?Boolean

Returns:

  • (Boolean)

103
104
105
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 103

def through_association?
  association.through?
end

#to_paramsObject


127
128
129
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 127

def to_params
  super.merge(:association => @association.name, @param_name => parent_id)
end