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.



80
81
82
83
84
85
86
87
88
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 80

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

#create_through_singular?Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 107

def create_through_singular?
  association.through_singular? && source_reflection.reverse
end

#create_with_parent?Boolean

Returns:

  • (Boolean)


111
112
113
114
115
116
117
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 111

def create_with_parent?
  if has_many? && !association.through?
    false
  elsif child_association || create_through_singular?
    true
  end
end

#default_sorting(chain) ⇒ Object



139
140
141
142
143
144
145
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 139

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)


127
128
129
130
131
132
133
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 127

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)


97
98
99
100
101
102
103
104
105
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 97

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 create_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)


135
136
137
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 135

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

#source_reflectionObject



119
120
121
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 119

def source_reflection
  @source_reflection ||= ActiveScaffold::DataStructures::Association::ActiveRecord.new(association.source_reflection)
end

#through_association?Boolean

Returns:

  • (Boolean)


123
124
125
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 123

def through_association?
  association.through?
end

#to_paramsObject



147
148
149
# File 'lib/active_scaffold/data_structures/nested_info.rb', line 147

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