module ControllerModule
module ActionModule
class ActionList < Base
- attr :order, :direction, :default_page_size, :max_page_size
+ attr :order, :direction, :default_page_size, :max_page_size, :return_item_name
def set_default
super
@direction = @args['direction'].to_i
@default_page_size = @args['default_page_size']
@max_page_size = @args['max_page_size']
+ @return_item_name = @args['return_item_name'] || @item_name
end
def a_arg_names
super + ['order', 'direction', 'default_page_size', 'max_page_size']
end
+ def find options = {}
+ if has_alias_action
+ return self.alias_action.find options
+ end
+ self.finder(options).order(
+ self.order_sql(options[:order], options[:direction])
+ ).page(options[:page]).per(options[:page_size])
+ end
+
+ def finder options = {}
+ finder_name = options[:finder] || 'find_' + @name
+ finder = if args = options[:param]
+ args = [args] unless options[:param].is_a?(Array) # param to array
+ self.finder_model.__send__(finder_name, *args)
+ else
+ self.finder_model.__send__(finder_name)
+ end
+ end
+
+ def finder_model
+ Manifest.manifest.models[@item_name].classify
+ end
+
+ def return_model
+ Manifest.manifest.models[@return_item_name].classify
+ end
+
+ def order_sql order, direction
+ order ||= self.order
+ direction ||= (self.direction < 0 ? :desc : :asc)
+ self.return_model.arel_table[order].__send__(direction)
+ end
+
+ def page page
+ page.to_i
+ page = 1 if page < 1
+ page
+ end
+
+ def page_size page_size
+ page_size ||= self.default_page_size
+ page_size = -1 if page_size < 0
+ page_size = self.max_page_size if page_size > self.max_page_size
+ page_size
+ end
+
+ def limited?
+ self.max_page_size > 0
+ end
+
+ def unlimited?
+ !self.limited?
+ end
+
end
end