2012-01-13 29 views
11

Trong di cư của tôi, tôi có:Cách đặt lại trường tăng tự động trong quá trình di chuyển ActiveRecord?

def up 
    MyModel.destroy_all 
    MyModel.create!({:id=>1,:name=>'foo'}) 
    MyModel.create!({:id=>2,:name=>'fooBar'}) 
    MyModel.create!({:id=>3,:name=>'fooNull'}) 
end 

vì tôi cần phải ghi đè dữ liệu đó là đã có trên bảng my_models

Nhưng Mặc dù tôi đang xác định id trên MySQL nó tiếp tục đánh số từ vị trí đó đã được.

Tôi cần phải đặt lại bộ đếm tự động cho id để chỉ có 3 bản ghi mới này với giá trị id máng di chuyển Active Record trên ứng dụng Ruby on Rails của tôi.

Trả lời

23

Bạn có 2 vấn đề riêng biệt. Một là bạn đang cố gắng để xác định id với gán hàng loạt, đường ray sẽ không cho phép bạn làm điều đó. Xem Overriding id on create in ActiveRecord để biết cách thực hiện điều đó.

Sự cố khác là tự động tăng không được đặt lại. Mỗi DBMS có một cách duy nhất để thiết lập bộ đếm gia tăng và đường ray không cung cấp cho bạn cách thức chung để truy cập chúng, mặc dù nó được thực hiện cho một số (không phải MySQL), xem Rails way to reset seed on id field

Vì vậy, bạn sẽ cần để chạy SQL cụ thể MySQL cho điều này, đó là một cái gì đó như:

ALTER TABLE my_models AUTO_INCREMENT = 1; 

này nên đặt lại với số sau id lớn nhất trong bảng của bạn (1 nếu không có bất kỳ)

4

Nếu bạn là bằng cách sử dụng PostgreSQL, bạn có thể chỉ cần thực hiện:

ModelName.connection.execute('ALTER SEQUENCE model_name_id_seq RESTART WITH 1') 

Ví dụ, đặt lại lĩnh vực tự động tăng cho các mô hình tài khoản sẽ trông như thế:

User.connection.execute('ALTER SEQUENCE users_id_seq RESTART WITH 1') 
+0

ALTER SEQUENCE không được hỗ trợ bởi MySQL – PinnyM

+1

Điều này hoạt động trên Postgres – Xavier

2

Trong kỳ trường hợp bất cứ ai khác làm thế nào để làm điều này với MYSQL: đây là mã người ta sẽ sử dụng trong cuộc di cư trong đặt hàng để thiết lập lại thặng dư tự động cho một bảng:

ActiveRecord::Base.connection.execute('ALTER TABLE foo_bars AUTO_INCREMENT = 1') 
  • đâu foo_bars sẽ là tên bảng mà auto_increment bạn đang cài đặt lại.

Tôi đã tìm ra điều này nhờ câu trả lời cho this question.

Các vấn đề liên quan