Class: Gemgento::Category
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Gemgento::Category
- Defined in:
- app/models/gemgento/category.rb
Overview
Instance Attribute Summary collapse
-
#sync_needed ⇒ Object
Returns the value of attribute sync_needed.
Class Method Summary collapse
-
.grouped_option(category) ⇒ Array(String, Integer)
Get the option value and any subsequent child values as a path.
-
.grouped_options ⇒ Array(String, Array(Array(String, Integer)))
Create an options array for use in an HTML select input.
Instance Method Summary collapse
- #after_touch ⇒ Object
-
#ancestors ⇒ Array(Category)
Returns list of ancestors, starting from parent until root.
- #descendents ⇒ Object
-
#enforce_positioning ⇒ void
Increment the position on all categories that come after.
-
#hierarchy ⇒ Array(Gemgento::Category)
Ordered list from root to self, excluding self.
-
#mark_deleted ⇒ void
Sets the deleted_at to the current timestamp.
-
#mark_deleted! ⇒ void
Marks the category as deleted and saves.
-
#products(store = nil) ⇒ ActiveRecord::Associations::CollectionProxy(Product)
Get products associated with the category.
- #sync_needed? ⇒ Boolean
-
#tree_path ⇒ String
Create a string representation of the path from the root to the Category.
Instance Attribute Details
#sync_needed ⇒ Object
Returns the value of attribute sync_needed.
34 35 36 |
# File 'app/models/gemgento/category.rb', line 34 def sync_needed @sync_needed end |
Class Method Details
.grouped_option(category) ⇒ Array(String, Integer)
Get the option value and any subsequent child values as a path.
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'app/models/gemgento/category.rb', line 105 def self.grouped_option(category) = [] category.children.where(is_active: true, parent: category).each do |child| << [child.name, child.id] child.children.where(is_active: true).each do |nested_child| path = nested_child.tree_path path = path.slice((path.index("> #{child.name} >") + 2)..-1) << [path, nested_child.id] end end return end |
.grouped_options ⇒ Array(String, Array(Array(String, Integer)))
Create an options array for use in an HTML select input. Categories are grouped under top level scoped categories.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'app/models/gemgento/category.rb', line 60 def self. = [] Gemgento::Category.top_level.each do |parent| = [["#{parent.name} (parent)", parent.id]] parent.children.where(is_active: true, parent: parent).each do |child| << [child.name, child.id] << grouped_option(child) if child.children.where(is_active: true).any? end << [parent.name, ] end return end |
Instance Method Details
#after_touch ⇒ Object
183 184 185 |
# File 'app/models/gemgento/category.rb', line 183 def after_touch # do nothing, plcaeholder end |
#ancestors ⇒ Array(Category)
Returns list of ancestors, starting from parent until root.
subchild1.ancestors # => [child1, root]
163 164 165 166 167 |
# File 'app/models/gemgento/category.rb', line 163 def ancestors node, nodes = self, [] nodes << node = node.parent while node.parent nodes end |
#descendents ⇒ Object
78 79 80 81 82 83 84 |
# File 'app/models/gemgento/category.rb', line 78 def descendents @descendents ||= begin children.includes(:children).map do |child| [child] + child.descendents end.flatten end end |
#enforce_positioning ⇒ void
This method returns an undefined value.
Increment the position on all categories that come after. Used to ensure correct positioning after changing the position of a single category.
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'app/models/gemgento/category.rb', line 141 def enforce_positioning Category.skip_callback(:save, :after, :enforce_positioning) last_position = self.position categories = Category.where('parent_id = ? AND position >= ? AND id != ?', self.parent_id, self.position, self.id) categories.each do |category| break if category.position != last_position category.position = category.position + 1 category.save last_position = category.position end Category.set_callback(:save, :after, :enforce_positioning) end |
#hierarchy ⇒ Array(Gemgento::Category)
Ordered list from root to self, excluding self.
89 90 91 92 93 94 95 96 97 98 99 |
# File 'app/models/gemgento/category.rb', line 89 def hierarchy parents = [] parent = self.parent while parent && !parent.parent_id.nil? parents << parent parent = parent.parent end return parents.reverse end |
#mark_deleted ⇒ void
This method returns an undefined value.
Sets the deleted_at to the current timestamp.
124 125 126 127 |
# File 'app/models/gemgento/category.rb', line 124 def mark_deleted self.deleted_at = Time.now self.shopify_adapter.destroy if self.shopify_adapter end |
#mark_deleted! ⇒ void
This method returns an undefined value.
Marks the category as deleted and saves.
132 133 134 135 |
# File 'app/models/gemgento/category.rb', line 132 def mark_deleted! mark_deleted self.save end |
#products(store = nil) ⇒ ActiveRecord::Associations::CollectionProxy(Product)
Get products associated with the category. Optional scope of store.
173 174 175 176 177 178 179 180 181 |
# File 'app/models/gemgento/category.rb', line 173 def products(store = nil) return super if store.nil? Product .joins(:product_categories) .where('gemgento_product_categories.store_id = ? AND gemgento_product_categories.category_id = ?', store.id, self.id) .order('gemgento_product_categories.position ASC') .uniq end |
#sync_needed? ⇒ Boolean
52 53 54 |
# File 'app/models/gemgento/category.rb', line 52 def sync_needed? self.sync_needed.to_bool end |
#tree_path ⇒ String
Create a string representation of the path from the root to the Category.
39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'app/models/gemgento/category.rb', line 39 def tree_path root = Category.root parent = self.parent path = self.name while !parent.nil? && parent != root do path = "#{parent.name} > #{path}" parent = parent.parent end return path end |