2009-03-06 67 views

Trả lời

0

Bạn cũng có thể thực thi SQL tùy ý trong quá trình di chuyển của mình.

Chúng tôi có một số phương pháp helper mà thêm phím nước ngoài vào các bảng của chúng tôi:

def add_foreign_key(from_table, from_column, to_table) 
    constraint_name = "fk_#{from_table}_#{from_column}" 

    execute %{alter table #{from_table} 
      add constraint #{constraint_name} 
      foreign key (#{from_column}) 
      references #{to_table}(id) 
      } 
    end 

Bạn có thể sử dụng bất kỳ SQL cơ sở dữ liệu của bạn hỗ trợ.

+2

Một tình huống mà bạn có thể phải sử dụng 'execute' là nếu Rails đã thêm một chỉ mục và đặt tên nó theo tên bảng, thì bạn đã đổi tên bảng. Ví dụ, tôi đã tạo 'users_roles' và thực hiện di chuyển để thêm chỉ mục, Rails có tên' index_users_roles_on_role_id'. Sau đó, tôi nhận ra tôi cần phải đổi tên bảng thành 'roles_users'. Sau đó khi tôi cố gắng loại bỏ chỉ mục, Rails đang tìm kiếm một chỉ mục có tên là 'index_roles_users_on_role_id'. Vì vậy, tôi đã phải sử dụng 'thực thi 'DROP INDEX index_users_roles_on_role_id ON roles_users" 'trong di trú của tôi. (Điều này là dành cho MySQL.) –

3

Theo số API, sử dụng remove_indexadd_index là cách duy nhất để đạt được điều này.

+5

Không còn đúng nữa. Nó có nên bị xóa không? – dgilperez

40

Rails 3 cung cấp một phím tắt để đổi tên một chỉ số:

rename_index :table_name, :old_name, :new_name 

http://guides.rubyonrails.org/migrations.html

Bằng cách này, nó không làm nhiều hơn là loại bỏ cái cũ và thêm mới:

http://apidock.com/rails/v2.3.8/ActiveRecord/ConnectionAdapters/SchemaStatements/rename_index

+1

rename_index dường như đã được thêm trở lại trong 2.3.8, liên kết thứ hai của bạn thậm chí còn hiển thị phiên bản đó. – mmacaulay

+3

rename_index dường như không thực sự làm bất cứ điều gì trong Rails 3.1.3. Việc di chuyển xuất hiện để chạy một cách rõ ràng, nhưng kiểm tra cả schema.rb và chạy 'SHOW INDEXES FROM table_name' trong MySQL cho thấy chỉ mục duy trì tên trước đó của nó. –

+4

Như được chỉ ra trong câu trả lời không phải là dưới đây các tên chỉ mục phải được cho là chuỗi hoặc lệnh rename_index không thành công – Willbill

52

rename_index nên được cung cấp chuỗi chứ không phải ký hiệu.

rename_index :table_name, 'old_name', 'new_name' 

Tôi đã gãi đầu một lúc khi cố đổi tên bảng và chỉ mục của bảng. Rails 3.2.3 và MySQL.

+0

PS: Nhớ 'rename_index' ** trước ** bạn' rename_column', nếu không thì SQLServer sẽ ném một ngoại lệ : 'Tham số @objname là mơ hồ hoặc @objtype được xác nhận quyền sở hữu (INDEX) là sai.' – Magne

8

Do Rails 5 (EDIT: cũng trong Rails 4), đổi tên cột cũng sẽ tự động đổi tên chỉ mục.

+0

Điều này thật tuyệt! Nó phải được đề cập trong câu trả lời được chấp nhận. –

+0

Vâng. Câu hỏi này đã được hỏi trong '09 !! 7 năm sau, rất nhiều thay đổi. Tự động của nó bây giờ. – gregblass

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