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



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

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.



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

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

#default_positionObject



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

def default_position
  acts_as_list_class.column_defaults[position_column.to_s]
end

#default_position?Boolean

Returns:

  • (Boolean)


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

def default_position?
  default_position && default_position == current_position
end

#first?Boolean

Returns:

  • (Boolean)


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

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

#higher_itemObject

Return the next higher item in the list.



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

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



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

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("#{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

Returns:

  • (Boolean)


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

def in_list?
  !not_in_list?
end

#increment_positionObject

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



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

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).



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

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

#insert_at!(position = acts_as_list_top) ⇒ Object



79
80
81
# File 'lib/acts_as_list/active_record/acts/list.rb', line 79

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

#last?Boolean

Returns:

  • (Boolean)


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

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
# File 'lib/acts_as_list/active_record/acts/list.rb', line 187

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("#{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.



98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/acts_as_list/active_record/acts/list.rb', line 98

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.



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/acts_as_list/active_record/acts/list.rb', line 84

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.



113
114
115
116
# File 'lib/acts_as_list/active_record/acts/list.rb', line 113

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.



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

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.



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

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

#not_in_list?Boolean

Returns:

  • (Boolean)


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

def not_in_list?
  current_position.nil?
end

#remove_from_listObject

Removes the item from the list.



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

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



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

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