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



289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
# File 'lib/active_scaffold/data_structures/column.rb', line 289

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
  @stripable = true if @column and @column.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.



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

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.



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

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.



211
212
213
# File 'lib/active_scaffold/data_structures/column.rb', line 211

def associated_number=(value)
  @associated_number = value
end

#associationObject (readonly)

the association from the ActiveRecord class



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

def association
  @association
end

#calculateObject

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



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

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



240
241
242
# File 'lib/active_scaffold/data_structures/column.rb', line 240

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



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

def form_ui
  @form_ui
end

#includesObject

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



158
159
160
# File 'lib/active_scaffold/data_structures/column.rb', line 158

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



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

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



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

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



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

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

#search_uiObject



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

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



167
168
169
# File 'lib/active_scaffold/data_structures/column.rb', line 167

def select_columns
  @select_columns
end

#send_form_on_update_columnObject

Returns the value of attribute send_form_on_update_column.



67
68
69
# File 'lib/active_scaffold/data_structures/column.rb', line 67

def send_form_on_update_column
  @send_form_on_update_column
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.



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

def show_blank_record=(value)
  @show_blank_record = value
end

#stripable=(value) ⇒ Object (writeonly)

whether the field should be stripped when search values or form values are read for this value



185
186
187
# File 'lib/active_scaffold/data_structures/column.rb', line 185

def stripable=(value)
  @stripable = 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



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

def weight
  @weight
end

Instance Method Details

#<=>(other_column) ⇒ Object



324
325
326
327
# File 'lib/active_scaffold/data_structures/column.rb', line 324

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



275
276
277
278
279
280
281
282
283
284
285
286
# File 'lib/active_scaffold/data_structures/column.rb', line 275

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)


212
213
214
# File 'lib/active_scaffold/data_structures/column.rb', line 212

def associated_number?
  @associated_number
end

#autolink?Boolean

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

Returns:

  • (Boolean)


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

def autolink?
  @autolink
end

#belongs_to_association?Boolean

Returns:

  • (Boolean)


250
251
252
# File 'lib/active_scaffold/data_structures/column.rb', line 250

def belongs_to_association?
  self.association && self.association.macro == :belongs_to
end

#calculation?Boolean

get whether to run a calculation on this column

Returns:

  • (Boolean)


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

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



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

def clear_link
  @link = nil
  @autolink = false
end

#field_nameObject

just the field (not table.field)



319
320
321
322
# File 'lib/active_scaffold/data_structures/column.rb', line 319

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


121
122
123
124
# File 'lib/active_scaffold/data_structures/column.rb', line 121

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)


247
248
249
# File 'lib/active_scaffold/data_structures/column.rb', line 247

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

#polymorphic_association?Boolean

Returns:

  • (Boolean)


256
257
258
# File 'lib/active_scaffold/data_structures/column.rb', line 256

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

#readonly_association?Boolean

Returns:

  • (Boolean)


259
260
261
262
263
264
265
266
267
# File 'lib/active_scaffold/data_structures/column.rb', line 259

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)


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

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

associate an action_link with this column



127
128
129
130
131
132
133
134
135
136
# File 'lib/active_scaffold/data_structures/column.rb', line 127

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)


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

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)


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

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

#sortObject



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

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!


74
75
76
77
78
79
80
81
# File 'lib/active_scaffold/data_structures/column.rb', line 74

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.



93
94
95
# File 'lib/active_scaffold/data_structures/column.rb', line 93

def sort_by(options)
  self.sort = options
end

#sortable?Boolean

Returns:

  • (Boolean)


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

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

#stripable?Boolean

Returns:

  • (Boolean)


186
187
188
# File 'lib/active_scaffold/data_structures/column.rb', line 186

def stripable?
  @stripable
end

#stripped_value(value) ⇒ Object



190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/active_scaffold/data_structures/column.rb', line 190

def stripped_value(value)
  if stripable?
    begin
      value.strip
    rescue
      Rails.logger.error("stripped_value: column #{self.name} is a db text column, but value is nt a string: #{value.inspect}. Please define column[:#{self.name}].stripable = false in config")
      value
    end
  else
    value
  end
end

#through_association?Boolean

Returns:

  • (Boolean)


253
254
255
# File 'lib/active_scaffold/data_structures/column.rb', line 253

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)


270
271
272
# File 'lib/active_scaffold/data_structures/column.rb', line 270

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