2013-02-12 31 views
8

Mỗi lần tôi chạy thanh ghi rake db:migrate quyết định thay đổi tệp schema.rb của mình. Trong một số trường hợp điều này là hoàn toàn hợp lý, tuy nhiên trong một số trường hợp khác có vẻ như nó đang làm nó không có lý do. Trường hợp tôi nhầm lẫn là khi tôi kéo một di chuyển mới và một phiên bản mới của schema.rb từ git, và sau đó chạy rake db:migrate. Vì phiên bản mới của tệp schema.rb đi kèm với quá trình di chuyển này, tôi không nên cập nhật schema.rb. Tuy nhiên, đường ray vẫn thay đổi nó, mọi lúc. Khi điều này xảy ra tôi thấy những thay đổi vô cùng ngớ ngẩn như:đường ray thay đổi schema.rb không có lý do

add_index "my_table", ["column1", "column2"], :name => "index_on_some_columns" 

để

add_index "my_table", ["column2", "column1"], :name => "index_on_some_columns" 

Khi điều này xảy ra tôi chỉ cần chạy git checkout db/schema.rb và tiếp tục cuộc sống của tôi, nhưng nó irkes tôi không có kết thúc. Có lý do tại sao nó làm điều này, và làm thế nào tôi có thể ngăn chặn nó làm điều này?

EDIT: Dưới đây là một đoạn trích từ một diff

@@ -165,12 +165,11 @@ ActiveRecord::Schema.define(:version => 20130206001907) do 
    t.column "updated_at", :datetime 
- t.column "coordinates", :point, :srid => 4326 
@@ -200,15 +199,16 @@ ActiveRecord::Schema.define(:version => 20130206001907) do 
    t.column "something", :boolean 
+ t.column "coordinates", :point, :srid => 4326 
+ t.column "random_string", :string 
    t.column "remote", :string 
- t.column "random_string", :string 
    end 

- add_index "my_table", ["id", "foreign_id"], :name => "index_active_my_table_on_foreign_and_id" 
- add_index "my_table", ["id", "active"], :name => "index_my_table_on_active_and_id" 
- add_index "my_table", ["id", "content_modified_at"], :name => "index_my_table_on_content_modified_at_and_id" 
+ add_index "my_table", ["foreign_id", "id"], :name => "index_active_my_table_on_foreign_and_id" 
+ add_index "my_table", ["active", "id"], :name => "index_my_table_on_active_and_id" 
+ add_index "my_table", ["content_modified_at", "id"], :name => "index_my_table_on_content_modified_at_and_id" 
+0

Chỉ mục này được xác định như thế nào trong tệp di chuyển của bạn? – Novae

+0

đăng sự khác biệt của bạn – cbrulak

+0

Trong nhiều trường hợp di chuyển cho biết 'add_index: my_table, [" column2 "," column1 "]' nhưng schema.rb được cung cấp qua git có thứ tự ngược lại: 'add_index" my_table ", [" column1 ", "column2"] '. Nó có vẻ là nhất quán, nhưng bây giờ tôi tự hỏi làm thế nào thứ tự ngược lại của cột bao giờ thực hiện nó là cách vào mã. Điều này có thể là ngây thơ nhưng điều này có thể có một cái gì đó để làm với làm việc với cả hai linux/mac? – wesdotcool

Trả lời

6

Kể từ khi phiên bản mới của tập tin schema.rb đi kèm với di cư này, tôi không nên cập nhật schema.rb.

Điều này là không chính xác.

Mỗi lần Rails chạy di chuyển, nó cập nhật tệp schema.rb bằng cách sử dụng cơ sở dữ liệu làm nguồn. Nó không nhìn vào tập tin hiện tại schema.rb, nó chỉ sử dụng thông tin từ cơ sở dữ liệu và ghi đè nó. Có vẻ như vấn đề thực sự là chạy cùng một di chuyển trong hai môi trường khác nhau (các kết hợp khác nhau của Ruby, Rails, MySQL, hệ điều hành) có thể mang lại kết quả khác nhau khi tạo một tệp schema.rb.

Giải pháp là đảm bảo mọi người kiểm tra mã đều sử dụng cùng một phiên bản phần mềm, ở mức độ có thể. Và nếu nó không phải là có thể (vì đây là một sự khác biệt giữa Windows so với Linux và Mac và bạn không cảm thấy muốn thay đổi hệ điều hành), bạn sẽ phải đối phó với sự bất tiện này.

+0

Cảm ơn bạn đã làm rõ điều đó đối với tôi. Tôi sẽ phải xem nếu tôi có thể hack cùng nhau một cái gì đó mà có thể phá vỡ thay đổi tập tin nếu nó không thực sự thay đổi! – wesdotcool

0

Đối với tôi, giải pháp đã tạo ra một rake db:schema:load trước tiên. Và hơn rake db:migrate ngừng thay đổi số schema.rb của tôi mà không có lý do gì.

LƯU Ý:rake db:schema:load sẽ xóa ALL dữ liệu hiện tại của bạn và tạo lại cơ sở dữ liệu đối với schema.rb hiện có.

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