Class | Product |
In: |
app/models/product.rb
|
Parent: | ActiveRecord::Base |
プロダクト(機能)のモデル。
LABEL_TYPE | = | [ [N_("Product|type|Type 1"), "ProductSingle"], [N_("Product|type|Type 2"), "ProductMultiple"], [N_("Product|type|Type 3"), "ProductDetailed"], ] |
root | -> | nested_set_root |
children | -> | nested_set_children |
name | -> | title |
key についての情報を返す。
# File app/models/product.rb, line 99 99: def self.current(key) 100: ccache = CacheEachRequest.current 101: ccache[:product] ||= {} 102: ccache[:product][:root] ||= root 103: ccache[:product][key] ||= yield root 104: end
エラーメッセージのために attributes を属性に持つインスタンスを返す。
# File app/models/product.rb, line 84 84: def self.for_error_message(attributes) 85: product = self.new(attributes) 86: product.name_po ||= 0 87: if product.valid? 88: raise "[bug] product must be with errors at here" 89: end 90: return product 91: end
権限によって閲覧が不可能と指定されている全てのプロダクトを返す。
# File app/models/product.rb, line 121 121: def self.invisible 122: Product.current(:invisible) do |r| 123: with_scope(:find => {:conditions => Permission.invisible_conditions(:product)}) { r.all_children } 124: end 125: end
権限によって変更が可能と指定されている全てのプロダクトを返す。
# File app/models/product.rb, line 107 107: def self.modifiable 108: Product.current(:modifiable) do |r| 109: with_scope(:find => {:conditions => Permission.modifiable_conditions(:product)}) { r.all_children } 110: end 111: end
閲覧が可能、または閲覧が可能な子孫を持つプロダクトを返す。
# File app/models/product.rb, line 128 128: def self.necessary 129: Product.current(:necessary) do |r| 130: top = Product.permissible.inject([]) {|seed,m| (seed.include? m) ? seed : (seed | m.self_and_ancestors)} - [r] 131: bot = Product.invisible.inject([]) {|seed,m| (seed.include? m) ? seed : (seed | m.full_set)} 132: mid = (r.all_children - top - bot).reject {|m| (top & m.ancestors).empty?} 133: top | mid 134: end 135: end
権限によって閲覧が可能と指定されている全てのプロダクトを返す。
# File app/models/product.rb, line 114 114: def self.permissible 115: Product.current(:permissible) do |r| 116: with_scope(:find => {:conditions => Permission.permissible_conditions(:product)}) { r.all_children } 117: end 118: end
メニューレイアウトでの根を返す。
# File app/models/product.rb, line 94 94: def self.root 95: find(:first, :conditions => "products.parent_id IS NULL", :order => "products.id") 96: end
x に関連する文書のノード全体を返す。 (削除されているノードを参照している辺やパスは削除する。)
# File app/models/product.rb, line 202 202: def document_nodes_for(x) 203: existing, removed = DocumentEdge.find(:all, :conditions => {:from_product_id => id, :from_id => x.id, :from_type => x.class.to_s}).select {|e| e.to_product.visible?}.partition(&:to) 204: removed.each do |e| 205: e.destroy 206: e.document_paths.each(&:destroy) 207: end 208: return existing.map(&:to) 209: end
x に関連付けられている文書を返す。 (削除されているノードを参照している文書は削除する。)
# File app/models/product.rb, line 192 192: def documents_for(x) 193: rels, removed = Document.find(:all, :conditions => {:relatable_product_id => id, :relatable_id => x.id, :relatable_type => x.class.to_s}).select {|d| d.target_product.visible?}.partition(&:target) 194: removed.each(&:destroy) 195: alts, removed = Document.find(:all, :conditions => {:target_product_id => id, :target_id => x.id, :target_type => x.class.to_s}).select {|d| d.relatable_product.visible?}.partition(&:relatable) 196: removed.each(&:destroy) 197: return rels | alts 198: end
アプリケーションの管理者によって用意される画面を返す。
# File app/models/product.rb, line 186 186: def master_displays 187: displays.find(:all, :conditions => {:type => %w|DisplayToList DisplayToShow DisplayToEdit DisplayToNew|}) 188: end
model_name からモデル名を返す。
# File app/models/product.rb, line 181 181: def model_class 182: @model_class ||= model_name.constantize 183: end
階層化された権限にしたがって変更可能かどうかを判定する。
# File app/models/product.rb, line 143 143: def modifiable? 144: return @modifiable if defined?(@modifiable) 145: return @modifiable = true if Product.modifiable.include?(self) 146: return @modifiable = false if Product.permissible.include?(self) 147: return @modifiable = false if Product.invisible.include?(self) 148: return @modifiable = parent.modifiable? if parent 149: return @modifiable = false 150: end
URL を構成するためのオプションを返す。
# File app/models/product.rb, line 162 162: def url_options 163: return @url_options if defined?(@url_options) 164: return {} unless self.motion 165: @url_options = {} 166: self.motion.scan(/(\w+)=(\w+)/) do |key, value| 167: @url_options[key.to_sym] = value 168: end 169: return @url_options 170: end
階層化された権限にしたがって利用可能かどうかを判定する。
# File app/models/product.rb, line 153 153: def visible? 154: return @visible if defined?(@visible) 155: return @visible = true if Product.permissible.include?(self) 156: return @visible = false if Product.invisible.include?(self) 157: return @visible = parent.visible? if parent 158: return @visible = false 159: end