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



94
95
96
97
98
99
# File 'lib/sequel/plugins/list.rb', line 94

def after_destroy
  super

  f = Sequel.expr(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.



88
89
90
# File 'lib/sequel/plugins/list.rb', line 88

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

#last_positionObject

Find the last position in the list containing this instance.



102
103
104
# File 'lib/sequel/plugins/list.rb', line 102

def last_position
  list_dataset.max(position_field).to_i
end

#list_datasetObject

A dataset that represents the list containing this instance.



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

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.



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

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. Raises an exception if target is less than 1 or greater than the last position in the list.



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/sequel/plugins/list.rb', line 119

def move_to(target, lp = nil)
  current = position_value
  if target != current
    checked_transaction do
      ds = list_dataset
      op, ds = if target < current
        target = 1 if target < 1
        [:+, ds.filter(position_field=>target...current)]
      else
        lp ||= last_position
        target = lp if target > lp
        [:-, ds.filter(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.



140
141
142
143
# File 'lib/sequel/plugins/list.rb', line 140

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

#move_to_topObject

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



146
147
148
# File 'lib/sequel/plugins/list.rb', line 146

def move_to_top
  move_to(1)
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.



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

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.



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

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.



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

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.



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

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