Class: ActiveScaffold::DataStructures::Column

Inherits:
Object
  • Object
show all
Includes:
Configurable
Defined in:
lib/active_scaffold/data_structures/column.rb

Constant Summary collapse

@@associated_limit =
3
@@associated_number =
true
@@show_blank_record =
true
[:new, :edit, :show]
@@association_form_ui =
nil

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Configurable

#configure, #method_missing

Constructor Details

#initialize(name, active_record_class) ⇒ Column

instantiation is handled internally through the DataStructures::Columns object



263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/active_scaffold/data_structures/column.rb', line 263

def initialize(name, active_record_class) #:nodoc:
  self.name = name.to_sym
  @column = active_record_class.columns_hash[self.name.to_s]
  @association = active_record_class.reflect_on_association(self.name)
  @autolink = !@association.nil?
  @active_record_class = active_record_class
  @table = active_record_class.table_name
  @associated_limit = self.class.associated_limit
  @associated_number = self.class.associated_number
  @show_blank_record = self.class.show_blank_record
  @actions_for_association_links = self.class.actions_for_association_links.clone if @association
  @options = {:format => :i18n_number} if @column.try(:number?)
  @form_ui = :checkbox if @column and @column.type == :boolean
  @form_ui = :textarea if @column and @column.type == :text
  @allow_add_existing = true
  @form_ui = self.class.association_form_ui if @association && self.class.association_form_ui
  
  # default all the configurable variables
  self.css_class = ''
  self.required = active_record_class.validators_on(self.name).map(&:class).include? ActiveModel::Validations::PresenceValidator
  self.sort = true
  self.search_sql = true
  
  @weight = estimate_weight

  self.includes = (association and not polymorphic_association?) ? [association.name] : []
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class ActiveScaffold::Configurable

Instance Attribute Details

Returns the value of attribute actions_for_association_links.



207
208
209
# File 'lib/active_scaffold/data_structures/column.rb', line 207

def actions_for_association_links
  @actions_for_association_links
end

#active_record_classObject (readonly)

Returns the value of attribute active_record_class.



5
6
7
# File 'lib/active_scaffold/data_structures/column.rb', line 5

def active_record_class
  @active_record_class
end

#allow_add_existingObject

Whether to enable add_existing for this column



21
22
23
# File 'lib/active_scaffold/data_structures/column.rb', line 21

def allow_add_existing
  @allow_add_existing
end

#associated_limitObject

Returns the value of attribute associated_limit.



183
184
185
# File 'lib/active_scaffold/data_structures/column.rb', line 183

def associated_limit
  @associated_limit
end

#associated_number=(value) ⇒ Object (writeonly)

Sets the attribute associated_number

Parameters:

  • value

    the value to set the attribute associated_number to.



188
189
190
# File 'lib/active_scaffold/data_structures/column.rb', line 188

def associated_number=(value)
  @associated_number = value
end

#associationObject (readonly)

the association from the ActiveRecord class



220
221
222
# File 'lib/active_scaffold/data_structures/column.rb', line 220

def association
  @association
end

#calculateObject

define a calculation for the column. anything that ActiveRecord::Calculations::ClassMethods#calculate accepts will do.



146
147
148
# File 'lib/active_scaffold/data_structures/column.rb', line 146

def calculate
  @calculate
end

#collapsedObject

Whether this column set is collapsed by default in contexts where collapsing is supported



18
19
20
# File 'lib/active_scaffold/data_structures/column.rb', line 18

def collapsed
  @collapsed
end

#columnObject (readonly)

the ConnectionAdapter::*Column object from the ActiveRecord class



217
218
219
# File 'lib/active_scaffold/data_structures/column.rb', line 217

def column
  @column
end

#css_classObject

this will be /joined/ to the :name for the td’s class attribute. useful if you want to style columns on different ActiveScaffolds the same way, but the columns have different names.



47
48
49
# File 'lib/active_scaffold/data_structures/column.rb', line 47

def css_class
  @css_class
end

#descriptionObject



38
39
40
41
42
43
44
# File 'lib/active_scaffold/data_structures/column.rb', line 38

def description
  if @description
    @description
  else
    I18n.t name, :scope => [:activerecord, :description, active_record_class.to_s.underscore.to_sym], :default => ''
  end
end

#form_uiObject



97
98
99
# File 'lib/active_scaffold/data_structures/column.rb', line 97

def form_ui
  @form_ui
end

#includesObject

a collection of associations to pre-load when finding the records on a page



154
155
156
# File 'lib/active_scaffold/data_structures/column.rb', line 154

def includes
  @includes
end

#inplace_editObject

Whether to enable inplace editing for this column. Currently works for text columns, in the List.



11
12
13
# File 'lib/active_scaffold/data_structures/column.rb', line 11

def inplace_edit
  @inplace_edit
end

#labelObject



32
33
34
# File 'lib/active_scaffold/data_structures/column.rb', line 32

def label
  as_(@label) || active_record_class.human_attribute_name(name.to_s)
end

#list_uiObject



102
103
104
# File 'lib/active_scaffold/data_structures/column.rb', line 102

def list_ui
  @list_ui || @form_ui
end

#nameObject

this is the name of the getter on the ActiveRecord model. it is the only absolutely required attribute … all others will be inferred from this name.



8
9
10
# File 'lib/active_scaffold/data_structures/column.rb', line 8

def name
  @name
end

#optionsObject

a place to store dev’s column specific options



112
113
114
# File 'lib/active_scaffold/data_structures/column.rb', line 112

def options
  @options
end

#required=(value) ⇒ Object (writeonly)

whether the field is required or not. used on the form for visually indicating the fact to the user. TODO: move into predicate



51
52
53
# File 'lib/active_scaffold/data_structures/column.rb', line 51

def required=(value)
  @required = value
end

#search_sqlObject



169
170
171
172
# File 'lib/active_scaffold/data_structures/column.rb', line 169

def search_sql
  self.initialize_search_sql if @search_sql === true
  @search_sql
end

#search_uiObject



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

def search_ui
  @search_ui || @form_ui || (@association && !polymorphic_association? ? :select : nil)
end

#select_columnsObject

a collection of columns to load when eager loading is disabled, if it’s nil all columns will be loaded



163
164
165
# File 'lib/active_scaffold/data_structures/column.rb', line 163

def select_columns
  @select_columns
end

#show_blank_record=(value) ⇒ Object (writeonly)

Sets the attribute show_blank_record

Parameters:

  • value

    the value to set the attribute show_blank_record to.



196
197
198
# File 'lib/active_scaffold/data_structures/column.rb', line 196

def show_blank_record=(value)
  @show_blank_record = value
end

#update_columnsObject

Returns the value of attribute update_columns.



56
57
58
# File 'lib/active_scaffold/data_structures/column.rb', line 56

def update_columns
  @update_columns
end

#weightObject

to modify the default order of columns



178
179
180
# File 'lib/active_scaffold/data_structures/column.rb', line 178

def weight
  @weight
end

Instance Method Details

#<=>(other_column) ⇒ Object



297
298
299
300
# File 'lib/active_scaffold/data_structures/column.rb', line 297

def <=>(other_column)
  order_weight = self.weight <=> other_column.weight
  order_weight != 0 ? order_weight : self.name.to_s <=> other_column.name.to_s
end

#==(other) ⇒ Object

this is so that array.delete and array.include?, etc., will work by column name



249
250
251
252
253
254
255
256
257
258
259
260
# File 'lib/active_scaffold/data_structures/column.rb', line 249

def ==(other) #:nodoc:
  # another column
  if other.respond_to? :name and other.class == self.class
    self.name == other.name.to_sym
  # a string or symbol
  elsif other.respond_to? :to_sym
    self.name == other.to_sym rescue false # catch "interning empty string"
  # unknown
  else
    self.eql? other
  end
end

#associated_number?Boolean

Returns:

  • (Boolean)


189
190
191
# File 'lib/active_scaffold/data_structures/column.rb', line 189

def associated_number?
  @associated_number
end

#autolink?Boolean

set an action_link to nested list or inline form in this column

Returns:

  • (Boolean)


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

def autolink?
  @autolink
end

#calculation?Boolean

get whether to run a calculation on this column

Returns:

  • (Boolean)


149
150
151
# File 'lib/active_scaffold/data_structures/column.rb', line 149

def calculation?
  !(@calculate == false or @calculate.nil?)
end

this should not only delete any existing link but also prevent column links from being automatically added by later routines



140
141
142
143
# File 'lib/active_scaffold/data_structures/column.rb', line 140

def clear_link
  @link = nil
  @autolink = false
end

#field_nameObject

just the field (not table.field)



292
293
294
295
# File 'lib/active_scaffold/data_structures/column.rb', line 292

def field_name
  return nil if virtual?
  column ? @active_record_class.connection.quote_column_name(column.name) : association.primary_key_name
end


117
118
119
120
# File 'lib/active_scaffold/data_structures/column.rb', line 117

def link
  @link = @link.call(self) if @link.is_a? Proc
  @link
end

#paramsObject

Any extra parameters this particular column uses. This is for create/update purposes.



24
25
26
27
# File 'lib/active_scaffold/data_structures/column.rb', line 24

def params
  # lazy initialize
  @params ||= Set.new
end

#plural_association?Boolean

Returns:

  • (Boolean)


224
225
226
# File 'lib/active_scaffold/data_structures/column.rb', line 224

def plural_association?
  self.association and [:has_many, :has_and_belongs_to_many].include? self.association.macro
end

#polymorphic_association?Boolean

Returns:

  • (Boolean)


230
231
232
# File 'lib/active_scaffold/data_structures/column.rb', line 230

def polymorphic_association?
  self.association and self.association.options.has_key? :polymorphic and self.association.options[:polymorphic]
end

#readonly_association?Boolean

Returns:

  • (Boolean)


233
234
235
236
237
238
239
240
241
# File 'lib/active_scaffold/data_structures/column.rb', line 233

def readonly_association?
  if self.association
    if self.association.options.has_key? :readonly
      self.association.options[:readonly]
    else
      self.through_association?
    end
  end
end

#required?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/active_scaffold/data_structures/column.rb', line 52

def required?
  @required
end

#searchable?Boolean

Returns:

  • (Boolean)


173
174
175
# File 'lib/active_scaffold/data_structures/column.rb', line 173

def searchable?
  search_sql != false && search_sql != nil
end

associate an action_link with this column



123
124
125
126
127
128
129
130
131
132
# File 'lib/active_scaffold/data_structures/column.rb', line 123

def set_link(action, options = {})
  if action.is_a?(ActiveScaffold::DataStructures::ActionLink) || (action.is_a? Proc)
    @link = action
  else
    options[:label] ||= self.label
    options[:position] ||= :after unless options.has_key?(:position)
    options[:type] ||= :member
    @link = ActiveScaffold::DataStructures::ActionLink.new(action, options)
  end
end

#show_blank_record?(associated) ⇒ Boolean

Returns:

  • (Boolean)


197
198
199
200
201
202
# File 'lib/active_scaffold/data_structures/column.rb', line 197

def show_blank_record?(associated)
  if @show_blank_record
    return false unless self.association.klass.authorized_for?(:crud_type => :create)
    self.plural_association? or (self.singular_association? and associated.empty?)
  end
end

#singular_association?Boolean

Returns:

  • (Boolean)


221
222
223
# File 'lib/active_scaffold/data_structures/column.rb', line 221

def singular_association?
  self.association and [:has_one, :belongs_to].include? self.association.macro
end

#sortObject



79
80
81
82
# File 'lib/active_scaffold/data_structures/column.rb', line 79

def sort
  self.initialize_sort if @sort === true
  @sort
end

#sort=(value) ⇒ Object

sorting on a column can be configured four ways:

sort = true               default, uses intelligent sorting sql default
sort = false              sometimes sorting doesn't make sense
sort = {:sql => ""}       define your own sql for sorting. this should be result in a sortable value in SQL. ActiveScaffold will handle the ascending/descending.
sort = {:method => ""}    define ruby-side code for sorting. this is SLOW with large recordsets!


70
71
72
73
74
75
76
77
# File 'lib/active_scaffold/data_structures/column.rb', line 70

def sort=(value)
  if value.is_a? Hash
    value.assert_valid_keys(:sql, :method)
    @sort = value
  else
    @sort = value ? true : false # force true or false
  end
end

#sort_by(options) ⇒ Object

a configuration helper for the self.sort property. simply provides a method syntax instead of setter syntax.



89
90
91
# File 'lib/active_scaffold/data_structures/column.rb', line 89

def sort_by(options)
  self.sort = options
end

#sortable?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/active_scaffold/data_structures/column.rb', line 84

def sortable?
  sort != false && !sort.nil?
end

#through_association?Boolean

Returns:

  • (Boolean)


227
228
229
# File 'lib/active_scaffold/data_structures/column.rb', line 227

def through_association?
  self.association and self.association.options[:through]
end

#virtual?Boolean

an interpreted property. the column is virtual if it isn’t from the active record model or any associated models

Returns:

  • (Boolean)


244
245
246
# File 'lib/active_scaffold/data_structures/column.rb', line 244

def virtual?
  column.nil? && association.nil?
end