Module: ActiveRecord::Acts::List::InstanceMethods

Defined in:
lib/acts_as_list/active_record/acts/list.rb

Instance Method Summary collapse

Instance Method Details

#decrement_positionObject

Decrease the position of this item without adjusting the rest of the list.



146
147
148
149
# File 'lib/acts_as_list/active_record/acts/list.rb', line 146

def decrement_position
  return unless in_list?
  set_list_position(self.send(position_column).to_i - 1)
end

#default_positionObject



206
207
208
# File 'lib/acts_as_list/active_record/acts/list.rb', line 206

def default_position
  acts_as_list_class.columns_hash[position_column.to_s].default
end

#default_position?Boolean



210
211
212
# File 'lib/acts_as_list/active_record/acts/list.rb', line 210

def default_position?
  default_position && default_position.to_i == send(position_column)
end

#first?Boolean



151
152
153
154
# File 'lib/acts_as_list/active_record/acts/list.rb', line 151

def first?
  return false unless in_list?
  !higher_items(1).exists?
end

#higher_itemObject

Return the next higher item in the list.



162
163
164
165
# File 'lib/acts_as_list/active_record/acts/list.rb', line 162

def higher_item
  return nil unless in_list?
  higher_items(1).first
end

#higher_items(limit = nil) ⇒ Object

Return the next n higher items in the list selects all higher items by default



169
170
171
172
173
174
175
176
177
# File 'lib/acts_as_list/active_record/acts/list.rb', line 169

def higher_items(limit=nil)
  limit ||= acts_as_list_list.count
  position_value = send(position_column)
  acts_as_list_list.
    where("#{quoted_position_column_with_table_name} <= ?", position_value).
    where("#{quoted_table_name}.#{self.class.primary_key} != ?", self.send(self.class.primary_key)).
    reorder(acts_as_list_order_argument(:desc)).
    limit(limit)
end

#in_list?Boolean

Test if this record is in a list



198
199
200
# File 'lib/acts_as_list/active_record/acts/list.rb', line 198

def in_list?
  !not_in_list?
end

#increment_positionObject

Increase the position of this item without adjusting the rest of the list.



140
141
142
143
# File 'lib/acts_as_list/active_record/acts/list.rb', line 140

def increment_position
  return unless in_list?
  set_list_position(self.send(position_column).to_i + 1)
end

#insert_at(position = acts_as_list_top) ⇒ Object

Insert the item at the given position (defaults to the top position of 1).



68
69
70
# File 'lib/acts_as_list/active_record/acts/list.rb', line 68

def insert_at(position = acts_as_list_top)
  insert_at_position(position)
end

#insert_at!(position = acts_as_list_top) ⇒ Object



72
73
74
# File 'lib/acts_as_list/active_record/acts/list.rb', line 72

def insert_at!(position = acts_as_list_top)
  insert_at_position(position, true)
end

#last?Boolean



156
157
158
159
# File 'lib/acts_as_list/active_record/acts/list.rb', line 156

def last?
  return false unless in_list?
  !lower_items(1).exists?
end

#lower_itemObject

Return the next lower item in the list.



180
181
182
183
# File 'lib/acts_as_list/active_record/acts/list.rb', line 180

def lower_item
  return nil unless in_list?
  lower_items(1).first
end

#lower_items(limit = nil) ⇒ Object

Return the next n lower items in the list selects all lower items by default



187
188
189
190
191
192
193
194
195
# File 'lib/acts_as_list/active_record/acts/list.rb', line 187

def lower_items(limit=nil)
  limit ||= acts_as_list_list.count
  position_value = send(position_column)
  acts_as_list_list.
    where("#{quoted_position_column_with_table_name} >= ?", position_value).
    where("#{quoted_table_name}.#{self.class.primary_key} != ?", self.send(self.class.primary_key)).
    reorder(acts_as_list_order_argument(:asc)).
    limit(limit)
end

#move_higherObject

Swap positions with the next higher item, if one exists.



91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/acts_as_list/active_record/acts/list.rb', line 91

def move_higher
  return unless higher_item

  acts_as_list_class.transaction do
    if higher_item.send(position_column) != self.send(position_column)
      swap_positions(higher_item, self)
    else
      higher_item.increment_position
      decrement_position
    end
  end
end

#move_lowerObject

Swap positions with the next lower item, if one exists.



77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/acts_as_list/active_record/acts/list.rb', line 77

def move_lower
  return unless lower_item

  acts_as_list_class.transaction do
    if lower_item.send(position_column) != self.send(position_column)
      swap_positions(lower_item, self)
    else
      lower_item.decrement_position
      increment_position
    end
  end
end

#move_to_bottomObject

Move to the bottom of the list. If the item is already in the list, the items below it have their position adjusted accordingly.



106
107
108
109
110
111
112
# File 'lib/acts_as_list/active_record/acts/list.rb', line 106

def move_to_bottom
  return unless in_list?
  acts_as_list_class.transaction do
    decrement_positions_on_lower_items
    assume_bottom_position
  end
end

#move_to_topObject

Move to the top of the list. If the item is already in the list, the items above it have their position adjusted accordingly.



116
117
118
119
120
121
122
# File 'lib/acts_as_list/active_record/acts/list.rb', line 116

def move_to_top
  return unless in_list?
  acts_as_list_class.transaction do
    increment_positions_on_higher_items
    assume_top_position
  end
end

#move_within_scope(scope_id) ⇒ Object

Move the item within scope. If a position within the new scope isn’t supplied, the item will be appended to the end of the list.



134
135
136
137
# File 'lib/acts_as_list/active_record/acts/list.rb', line 134

def move_within_scope(scope_id)
  send("#{scope_name}=", scope_id)
  save!
end

#not_in_list?Boolean



202
203
204
# File 'lib/acts_as_list/active_record/acts/list.rb', line 202

def not_in_list?
  send(position_column).nil?
end

#remove_from_listObject

Removes the item from the list.



125
126
127
128
129
130
# File 'lib/acts_as_list/active_record/acts/list.rb', line 125

def remove_from_list
  if in_list?
    decrement_positions_on_lower_items
    set_list_position(nil)
  end
end

#set_list_position(new_position, raise_exception_if_save_fails = false) ⇒ Object

Sets the new position and saves it



215
216
217
218
# File 'lib/acts_as_list/active_record/acts/list.rb', line 215

def set_list_position(new_position, raise_exception_if_save_fails=false)
  write_attribute position_column, new_position
  raise_exception_if_save_fails ? save! : save
end