mirror of
https://github.com/discourse/discourse.git
synced 2024-11-28 08:23:43 +08:00
5f64fd0a21
Introduce new patterns for direct sql that are safe and fast. MiniSql is not prone to memory bloat that can happen with direct PG usage. It also has an extremely fast materializer and very a convenient API - DB.exec(sql, *params) => runs sql returns row count - DB.query(sql, *params) => runs sql returns usable objects (not a hash) - DB.query_hash(sql, *params) => runs sql returns an array of hashes - DB.query_single(sql, *params) => runs sql and returns a flat one dimensional array - DB.build(sql) => returns a sql builder See more at: https://github.com/discourse/mini_sql
52 lines
1.4 KiB
Ruby
52 lines
1.4 KiB
Ruby
require "rails_helper"
|
|
|
|
describe Positionable do
|
|
|
|
def positions
|
|
TestItem.order('position asc, id asc').pluck(:id)
|
|
end
|
|
|
|
context "move_to" do
|
|
before do
|
|
class TestItem < ActiveRecord::Base
|
|
include Positionable
|
|
end
|
|
|
|
DB.exec("create temporary table test_items(id int primary key, position int)")
|
|
end
|
|
|
|
after do
|
|
DB.exec("drop table test_items")
|
|
|
|
# import is making my life hard, we need to nuke this out of orbit
|
|
des = ActiveSupport::DescendantsTracker.class_variable_get :@@direct_descendants
|
|
des[ActiveRecord::Base].delete(TestItem)
|
|
end
|
|
|
|
it "can position stuff correctly" do
|
|
5.times do |i|
|
|
DB.exec("insert into test_items(id,position) values(#{i}, #{i})")
|
|
end
|
|
|
|
expect(positions).to eq([0, 1, 2, 3, 4])
|
|
TestItem.find(3).move_to(0)
|
|
expect(positions).to eq([3, 0, 1, 2, 4])
|
|
expect(TestItem.pluck(:position).sort).to eq([0, 1, 2, 3, 4])
|
|
|
|
TestItem.find(3).move_to(1)
|
|
expect(positions).to eq([0, 3, 1, 2, 4])
|
|
|
|
# this is somewhat odd, but when there is no such position, not much we can do
|
|
TestItem.find(1).move_to(5)
|
|
expect(positions).to eq([0, 3, 2, 4, 1])
|
|
|
|
expect(TestItem.pluck(:position).sort).to eq([0, 1, 2, 3, 4])
|
|
|
|
item = TestItem.new
|
|
item.id = 7
|
|
item.save
|
|
expect(item.position).to eq(5)
|
|
end
|
|
end
|
|
end
|