2009-11-02 30 views
35

Tôi đã tạo một bảng mới bao gồm cột "ghi chú". Mặc định là varchar (255) tôi tin nhưng tôi muốn cột này là một vùng văn bản so với một trường và để cho phép nhiều dữ liệu hơn. Tôi tưởng tượng rằng tôi sẽ thực hiện thay đổi này trong ActiveRecord :: Tệp di chuyển nhưng tôi tò mò về định dạng. Tôi chỉ cần thay đổi varchar (255) thành varchar (1000) chẳng hạn? (Nếu có định dạng là gì?câu hỏi di trú varchar cho Ruby on Rails

def self.up 
    create_table :notes do |t| 
     t.string :note :varchar(1000) 
    end 

Đó có phải là định dạng đúng không? Hơn nữa, làm thế nào để tôi có được lĩnh vực nhập được nhiều hàng. Xin lỗi nếu điều này là dễ dàng thứ nhưng tôi mới để lập trình và RoR. Cảm ơn.

Trả lời

21

Bạn có thể chỉ cần sử dụng 'text' loại thay vì 'chuỗi'.

def self.up 
    create_table :notes do |t| 
    t.text :note 
    end 
end 

sử dụng 'text' loại sẽ dẫn đến cột cơ sở dữ liệu kiểu tEXT. Varchar thường được giới hạn tối đa chiều dài 255 (trong MySQL, các RDBMS khác có các giới hạn tương tự)

Nếu bạn sử dụng trình trợ giúp biểu mẫu của Rails, một văn bản textarea sẽ là đầu ra cho trường này (vì nó thuộc loại 'văn bản'). textarea là phần tử biểu mẫu chấp nhận đầu vào nhiều dòng.

Edit: Nếu bạn đã di chuyển các create_table, bạn có thể tạo một sự chuyển đổi mới để thay đổi các loại cột:

def self.up 
    change_column :notes, :note, :text 
end 
+0

Tôi có thể thay đổi tệp ..._ create_notes.rb ban đầu đã được tạo không? Sau đó, làm rake db: di chuyển để thực hiện thay đổi này? Hoặc sẽ gây ra vấn đề và tôi nên làm một loại bỏ các cột cũ hoặc thay đổi? – bgadoci

+0

Nếu bạn đã di chuyển, bạn cần phải xóa cơ sở dữ liệu, tạo lại và di chuyển (phá hủy tất cả dữ liệu trong cơ sở dữ liệu) hoặc bạn cần thay đổi các cột như Ben đề xuất. Nếu không, nếu bạn chưa di chuyển, chỉ cần thay đổi dòng trong di chuyển của bạn và chạy di chuyển. – EmFi

+0

@bgadoci: Nếu bạn chưa từng gọi db: di chuyển sau khi quá trình di chuyển này được tạo, bạn có thể chỉ cần chỉnh sửa tệp trước khi gọi db: di chuyển. Nếu không, bạn có thể tạo di chuyển mới để thực hiện thay đổi: def self.up change_column: ghi chú,: lưu ý,: văn bản kết thúc –

27

Bạn có thể thay đổi độ dài với các tùy chọn giới hạn như vậy ...

def self.up 
    change_column :notes, :note, :string, :limit => 1000 
end 
+0

Tôi có phải thực hiện thay đổi này thông qua thiết bị đầu cuối trước bằng cách thực hiện lệnh script/create migration ... và sau đó chỉnh sửa tệp mới không? Hoặc tôi có thể chỉ cần mở tệp di chuyển ban đầu và thay đổi, lưu và rake db: di chuyển? – bgadoci

+0

Nếu bạn là một trong những bảng cuối cùng được tạo, bạn đang ở chế độ phát triển, v.v., sau đó quay lại. Kiểm tra schema.rb để xem colums không còn được liệt kê nữa, sau đó chỉnh sửa quá trình di chuyển và chạy lại db. Điều này sẽ không hoạt động nếu bạn có dữ liệu trong trường, v.v. –

+1

Đây là câu trả lời đúng nếu bạn muốn giữ một varchar, lưu ý rằng bạn cần MySQL 5.0.3 hoặc tốt hơn để sử dụng giới hạn lớn hơn 255 (http://dev.mysql.com/doc/refman/5.0/en/char.html) – Kris

7

Kể từ khi tôi đã có rất nhiều dữ liệu đã được lưu trữ Tôi đã từng

self.up 
    change_column :notes, :note, :text, :limit => nil 
end 

Nếu tôi rời khỏi tùy chọn: limit => nil thì kiểu cột sẽ thay đổi từ varchar thành văn bản, nhưng nó vẫn có độ dài tối đa 255 ký tự.

+0

cảm ơn! nó không được viết ở bất cứ đâu .. – nurinur