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

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

Instance Method Summary collapse

Instance Method Details

#current_positionObject

Get the current position of the item in the list



76
77
78
79
# File 'lib/acts_as_list/active_record/acts/list.rb', line 76

def current_position
  position = send(position_column)
  position ? position.to_i : nil
end

#decrement_positionObject

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



154
155
156
157
# File 'lib/acts_as_list/active_record/acts/list.rb', line 154

def decrement_position
  return unless in_list?
  set_list_position(current_position - 1)
end

#default_positionObject



212
213
214
# File 'lib/acts_as_list/active_record/acts/list.rb', line 212

def default_position
  acts_as_list_class.column_defaults[position_column.to_s]
end

#default_position?Boolean

Returns:

  • (Boolean)


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

def default_position?
  default_position && default_position == current_position
end

#first?Boolean

Returns:

  • (Boolean)


159
160
161
162
# File 'lib/acts_as_list/active_record/acts/list.rb', line 159

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

#higher_itemObject

Return the next higher item in the list.



170
171
172
173
# File 'lib/acts_as_list/active_record/acts/list.rb', line 170

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



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

def higher_items(limit=nil)
  limit ||= acts_as_list_list.count
  acts_as_list_list.
    where("#{quoted_position_column_with_table_name} <= ?", current_position).
    where.not(primary_key_condition).
    reorder(acts_as_list_order_argument(:desc)).
    limit(limit)
end

#in_list?Boolean

Test if this record is in a list

Returns:

  • (Boolean)


204
205
206
# File 'lib/acts_as_list/active_record/acts/list.rb', line 204

def in_list?
  !not_in_list?
end

#increment_positionObject

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



148
149
150
151
# File 'lib/acts_as_list/active_record/acts/list.rb', line 148

def increment_position
  return unless in_list?
  set_list_position(current_position + 1)
end

#insert_at(position = acts_as_list_top) ⇒ Object

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



82
83
84
# File 'lib/acts_as_list/active_record/acts/list.rb', line 82

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

#insert_at!(position = acts_as_list_top) ⇒ Object



86
87
88
# File 'lib/acts_as_list/active_record/acts/list.rb', line 86

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

#last?Boolean

Returns:

  • (Boolean)


164
165
166
167
# File 'lib/acts_as_list/active_record/acts/list.rb', line 164

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

#lower_itemObject

Return the next lower item in the list.



187
188
189
190
# File 'lib/acts_as_list/active_record/acts/list.rb', line 187

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



194
195
196
197
198
199
200
201
# File 'lib/acts_as_list/active_record/acts/list.rb', line 194

def lower_items(limit=nil)
  limit ||= acts_as_list_list.count
  acts_as_list_list.
    where("#{quoted_position_column_with_table_name} >= ?", current_position).
    where.not(primary_key_condition).
    reorder(acts_as_list_order_argument(:asc)).
    limit(limit)
end

#move_higherObject

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



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

def move_higher
  return unless higher_item

  acts_as_list_class.transaction do
    if higher_item.current_position != current_position
      swap_positions_with(higher_item)
    else
      higher_item.increment_position
      decrement_position
    end
  end
end

#move_lowerObject

Swap positions with the next lower 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_lower
  return unless lower_item

  acts_as_list_class.transaction do
    if lower_item.current_position != current_position
      swap_positions_with(lower_item)
    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.



120
121
122
123
# File 'lib/acts_as_list/active_record/acts/list.rb', line 120

def move_to_bottom
  return unless in_list?
  insert_at_position bottom_position_in_list.to_i
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.



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

def move_to_top
  return unless in_list?
  insert_at_position acts_as_list_top
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.



142
143
144
145
# File 'lib/acts_as_list/active_record/acts/list.rb', line 142

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

#not_in_list?Boolean

Returns:

  • (Boolean)


208
209
210
# File 'lib/acts_as_list/active_record/acts/list.rb', line 208

def not_in_list?
  current_position.nil?
end

#remove_from_listObject

Removes the item from the list.



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

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



221
222
223
224
# File 'lib/acts_as_list/active_record/acts/list.rb', line 221

def set_list_position(new_position, raise_exception_if_save_fails=false)
  self[position_column] = new_position
  raise_exception_if_save_fails ? save! : save
end