Module: Sequel::Plugins::List::InstanceMethods

Defined in:
lib/sequel/plugins/list.rb

Instance Method Summary collapse

Instance Method Details

#after_destroyObject

When destroying an instance, move all entries after the instance down one position, so that there aren't any gaps


104
105
106
107
108
109
# File 'lib/sequel/plugins/list.rb', line 104

def after_destroy
  super

  f = Sequel[position_field]
  list_dataset.where(f > position_value).update(f => f - 1)
end

#at_position(p) ⇒ Object

The model object at the given position in the list containing this instance.


98
99
100
# File 'lib/sequel/plugins/list.rb', line 98

def at_position(p)
  list_dataset.first(position_field => p)
end

#before_validationObject

Set the value of the position_field to the maximum value plus 1 unless the position field already has a value.


187
188
189
190
191
192
# File 'lib/sequel/plugins/list.rb', line 187

def before_validation
  unless get_column_value(position_field)
    set_column_value("#{position_field}=", list_dataset.max(position_field).to_i+1)
  end
  super
end

#last_positionObject

Find the last position in the list containing this instance.


112
113
114
# File 'lib/sequel/plugins/list.rb', line 112

def last_position
  list_dataset.max(position_field).to_i
end

#list_datasetObject

A dataset that represents the list containing this instance.


117
118
119
# File 'lib/sequel/plugins/list.rb', line 117

def list_dataset
  model.scope_proc ? model.scope_proc.call(self) : model.dataset
end

#move_down(n = 1) ⇒ Object

Move this instance down the given number of places in the list, or 1 place if no argument is specified.


123
124
125
# File 'lib/sequel/plugins/list.rb', line 123

def move_down(n = 1)
  move_to(position_value + n)
end

#move_to(target, lp = nil) ⇒ Object

Move this instance to the given place in the list. If lp is not given or greater than the last list position, uses the last list position. If lp is less than the top list position, uses the top list position.


131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/sequel/plugins/list.rb', line 131

def move_to(target, lp = nil)
  current = position_value
  if target != current
    checked_transaction do
      ds = list_dataset
      op, ds = if target < current
        target = model.top_of_list if target < model.top_of_list
        [:+, ds.where(position_field=>target...current)]
      else
        lp ||= last_position
        target = lp if target > lp
        [:-, ds.where(position_field=>(current + 1)..target)]
      end
      ds.update(position_field => Sequel::SQL::NumericExpression.new(op, position_field, 1))
      update(position_field => target)
    end
  end
  self
end

#move_to_bottomObject

Move this instance to the bottom (last position) of the list.


152
153
154
155
# File 'lib/sequel/plugins/list.rb', line 152

def move_to_bottom
  lp = last_position 
  move_to(lp, lp)
end

#move_to_topObject

Move this instance to the top (first position, usually position 1) of the list.


158
159
160
# File 'lib/sequel/plugins/list.rb', line 158

def move_to_top
  move_to(model.top_of_list)
end

#move_up(n = 1) ⇒ Object

Move this instance the given number of places up in the list, or 1 place if no argument is specified.


164
165
166
# File 'lib/sequel/plugins/list.rb', line 164

def move_up(n = 1)
  move_to(position_value - n) 
end

#next(n = 1) ⇒ Object

The model instance the given number of places below this model instance in the list, or 1 place below if no argument is given.


170
171
172
# File 'lib/sequel/plugins/list.rb', line 170

def next(n = 1)
  n == 0 ? self : at_position(position_value + n)
end

#position_valueObject

The value of the model's position field for this instance.


175
176
177
# File 'lib/sequel/plugins/list.rb', line 175

def position_value
  get_column_value(position_field)
end

#prev(n = 1) ⇒ Object

The model instance the given number of places below this model instance in the list, or 1 place below if no argument is given.


181
182
183
# File 'lib/sequel/plugins/list.rb', line 181

def prev(n = 1)
  self.next(n * -1)
end