OSDN Git Service

6524e8e18efb9f09cc75cfdda1dc90f6427680ba
[pettanr/pettanr.git] / app / models / comic.rb
1 class Comic < ActiveRecord::Base
2   has_many :panels, :dependent => :destroy
3   belongs_to :author
4   
5   validates :title, :presence => true, :length => {:maximum => 100}\r
6   validates :width, :presence => true, :numericality => true, :not_zero => true
7   validates :height, :presence => true, :numericality => true, :not_zero => true
8   validates :visible, :presence => true, :numericality => true, :inclusion => {:in => 0..3}
9   validates :editable, :presence => true, :numericality => true, :inclusion => {:in => 0..3}
10   
11   before_save do |r|
12     r.supply_default
13   end
14   
15   def supply_default
16     self.visible = 0 if self.visible.blank?
17     self.editable= 0 if self.editable.blank?
18   end
19   
20   def own? author
21     return false unless author
22     self.author_id == author.id
23   end
24   
25   def visible? author
26     self.visible > 0 or self.own?(author)
27   end
28   
29   def disp_editable
30     editable == 1 ? 'O' : 'X'
31   end
32   
33   def disp_visible
34     visible == 1 ? 'O' : 'X'
35   end
36   
37   def self.default_page_size
38     25
39   end
40   
41   def self.max_page_size
42     100
43   end
44   
45   def self.page prm = nil
46     page = prm.to_i
47     page = 1 if page < 1
48     page
49   end
50   
51   def self.page_size prm = self.default_page_size
52     page_size = prm.to_i
53     page_size = self.max_page_size if page_size > self.max_page_size
54     page_size = self.default_page_size if page_size < 1
55     page_size
56   end
57   
58   def self.list opt = {}, page = 1, page_size = self.default_page_size
59     opt.merge!(self.list_opt) unless opt[:include]
60     opt.merge!({:conditions => ['visible > 0'], :order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size})
61     Comic.find(:all, opt)
62   end
63   
64   def self.list_opt
65     {:include => :author}
66   end
67   
68   def self.list_json_opt
69     {:include => :author}
70   end
71   
72   def self.show cid, opt = {}
73     Comic.find(cid, :include => self.show_include_opt(opt))
74   end
75   
76   def self.show_include_opt opt = {}
77     res = [:author]
78     res.push(opt[:include]) if opt[:include]
79     res
80   end
81   
82   def self.show_json_include_opt
83     {:include => :author}
84   end
85   
86   def self.play cid, opt = {}
87     Comic.find(cid, include: [
88       :author, 
89       :panels => [
90         :panel_pictures => :resource_picture, 
91         :balloons => :speaches
92       ]
93     ], order: 'panels.t, speaches.t')
94   end
95   
96   def to_json_play
97     self.to_json( :include => {:author => {}, :panels => {:methods => :panel_element}})
98   end
99   
100   def self.visible_count
101     Comic.count 'visible > 0'
102   end
103   
104 end