@@ -216,6 +216,8 @@ def arrayize(collection)
216
216
view . instance_exec ( obj , collection , self , &opts [ :block ] )
217
217
elsif opts [ :proc ]
218
218
view . instance_exec ( obj , collection , self , &opts [ :proc ] )
219
+ elsif opts [ :type ] == :belongs_to
220
+ val = ( obj . send ( name ) rescue nil ) . to_s
219
221
else
220
222
val = ( obj . send ( name ) rescue nil )
221
223
val = ( obj [ opts [ :index ] ] rescue nil ) if val == nil
@@ -266,9 +268,27 @@ def table_columns_with_defaults
266
268
267
269
def initalize_table_columns ( cols )
268
270
sql_table = ( collection . table rescue nil )
271
+
272
+ # Here we identify all belongs_to associations and build up a Hash like:
273
+ # {:user => {:foreign_key => 'user_id', :klass => User}, :order => {:foreign_key => 'order_id', :klass => Effective::Order}}
274
+ belong_tos = ( collection . ancestors . first . reflect_on_all_associations ( :belongs_to ) rescue [ ] ) . inject ( HashWithIndifferentAccess . new ( ) ) do |retval , bt |
275
+ klass = bt . klass || ( bt . foreign_type . gsub ( '_type' , '' ) . classify . safe_constantize rescue nil )
276
+
277
+ if bt . foreign_key . present? && klass . present?
278
+ retval [ bt . name ] = { :foreign_key => bt . foreign_key , :klass => klass } # Set the value into our Hash
279
+ end
280
+
281
+ retval
282
+ end
283
+
269
284
index = -1
270
285
271
286
cols . each do |name , _ |
287
+ # If this is a belongs_to, add an :if clause specifying a collection scope if
288
+ if belong_tos . key? ( name )
289
+ cols [ name ] [ :if ] ||= Proc . new { attributes [ belong_tos [ name ] [ :foreign_key ] ] . blank? } # :if => Proc.new { attributes[:user_id].blank? }
290
+ end
291
+
272
292
# If an :if => ... option is passed, evaluate it now.
273
293
# if the value is false, skip setting up this table_column and ensure col[name][:index] is nil
274
294
# in table_column_with_defaults, we will select only table columns with an index
@@ -277,27 +297,28 @@ def initalize_table_columns(cols)
277
297
next
278
298
end
279
299
280
- sql_column = ( collection . columns rescue [ ] ) . find { |column | column . name == name . to_s }
300
+ sql_column = ( collection . columns rescue [ ] ) . find do |column |
301
+ column . name == name . to_s || ( belong_tos . key? ( name ) && column . name == belong_tos [ name ] [ :foreign_key ] )
302
+ end
281
303
282
304
cols [ name ] [ :index ] = ( index += 1 ) # So first one is assigned 0
283
305
cols [ name ] [ :array_column ] ||= false
284
306
285
307
cols [ name ] [ :name ] ||= name
286
308
cols [ name ] [ :label ] ||= name . titleize
287
309
cols [ name ] [ :column ] ||= ( sql_table && sql_column ) ? "\" #{ sql_table . name } \" .\" #{ sql_column . name } \" " : name
288
- cols [ name ] [ :type ] ||= sql_column . try ( :type ) || :string
310
+ cols [ name ] [ :type ] ||= ( belong_tos . key? ( name ) ? :belongs_to : sql_column . try ( :type ) ) . presence || :string
289
311
cols [ name ] [ :width ] ||= nil
290
312
cols [ name ] [ :sortable ] = true if cols [ name ] [ :sortable ] == nil
291
- cols [ name ] [ :filter ] = initialize_table_column_filter ( cols [ name ] [ :filter ] , cols [ name ] [ :type ] )
313
+ cols [ name ] [ :filter ] = initialize_table_column_filter ( cols [ name ] [ :filter ] , cols [ name ] [ :type ] , belong_tos [ name ] )
292
314
293
315
if cols [ name ] [ :partial ]
294
316
cols [ name ] [ :partial_local ] ||= ( sql_table . try ( :name ) || cols [ name ] [ :partial ] . split ( '/' ) . last ( 2 ) . first . presence || 'obj' ) . singularize . to_sym
295
317
end
296
318
end
297
-
298
319
end
299
320
300
- def initialize_table_column_filter ( filter , col_type )
321
+ def initialize_table_column_filter ( filter , col_type , belongs_to )
301
322
return { :type => :null , :when_hidden => false } if filter == false
302
323
303
324
if filter . kind_of? ( Symbol )
@@ -309,6 +330,12 @@ def initialize_table_column_filter(filter, col_type)
309
330
end
310
331
311
332
case col_type # null, number, select, number-range, date-range, checkbox, text(default)
333
+ when :belongs_to
334
+ {
335
+ :type => :select ,
336
+ :when_hidden => false ,
337
+ :values => Proc . new { belongs_to [ :klass ] . all . map { |obj | [ obj . id , obj . to_s ] } . sort { |x , y | x [ 1 ] <=> y [ 1 ] } }
338
+ } . merge ( filter )
312
339
when :integer
313
340
{ :type => :number , :when_hidden => false } . merge ( filter )
314
341
when :boolean
0 commit comments