I should take out the model validation for integers. 

I found I couldn't do "validates_uniqueness_of :position" at the model level because in the middle of switching positions around, some of them will collide. So the solution was to check the uniqueness of positions all at once, before making changes, in the controller. Then because I had this extra validation condition, the official solution with transactions got a little unwieldy (especially since the unique position check does not throw an exception). So I just did both checks up front in the controller.

Thoughts on a better approach are most welcome!