OSDN Git Service

fix: bin tool
[pettanr/pettanr.git] / lib / manifest / controller / action / list.rb
index c6779b6..873755d 100644 (file)
@@ -2,7 +2,7 @@ module Manifest
   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
@@ -17,12 +17,67 @@ module Manifest
           @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