OSDN Git Service

dec4beb1965f9b95af254b4bca4cf3ec06c00765
[pettanr/pettanr.git] / lib / manifest / controller / action / list.rb
1 module Manifest
2   module ControllerModule
3     module ActionModule
4       class ActionList < Base
5         attr :order, :direction, :default_page_size, :max_page_size, :return_item_name
6         
7         def set_default
8           super
9           @args['direction'] ||= -1
10           @args['default_page_size'] ||= 25
11           @args['max_page_size'] ||= 100
12         end
13         
14         def init
15           super
16           @order = @args['order'] || 'updated_at'
17           @direction = @args['direction'].to_i
18           @default_page_size = @args['default_page_size']
19           @max_page_size = @args['max_page_size']
20           @return_item_name = @args['return_item_name'] || @item_name
21         end
22         
23         def a_arg_names
24           super + ['order', 'direction', 'default_page_size', 'max_page_size']
25         end
26         
27         def find options = {}
28           self.finder(options).order(
29             self.order_sql(options[:order], options[:direction])
30           ).page(options[:page]).per(options[:page_size])
31         end
32         
33         def finder options = {}
34           finder_name = options[:finder] || 'find_' + @name
35           finder = if args = options[:param]
36             args = [args] unless options[:param].is_a?(Array)  # param to array
37             self.finder_model.__send__(finder_name, *args)
38           else
39             self.finder_model.__send__(finder_name)
40           end
41         end
42         
43         def finder_model
44           Manifest.manifest.models[@item_name].classify
45         end
46         
47         def return_model
48           Manifest.manifest.models[@return_item_name].classify
49         end
50         
51         def order_sql order, direction
52           order ||= self.order
53           direction ||= (self.direction < 0 ? :desc : :asc)
54           self.return_model.arel_table[order].__send__(direction)
55         end
56         
57         def page page
58           page.to_i
59           page = 1 if page < 1
60           page
61         end
62         
63         def page_size page_size
64           page_size ||= self.default_page_size
65           page_size = -1 if page_size < 0
66           page_size = self.max_page_size if page_size > self.max_page_size
67           page_size
68         end
69         
70         def limited?
71           self.max_page_size > 0
72         end
73         
74         def unlimited?
75           !self.limited?
76         end
77         
78       end
79       
80     end
81   end
82 end