Bạn nên sử dụng text
với Rails nếu bạn muốn một chuỗi không có giới hạn độ dài. Sự di chuyển như thế này:
def up
change_column :your_table, :your_column, :text
end
def down
# This might cause trouble if you have strings longer
# than 255 characters.
change_column :your_table, :your_column, :string
end
nên sắp xếp mọi thứ. Bạn có thể muốn :null => false
hoặc một số tùy chọn khác ở cuối quá trình đó.
Khi bạn sử dụng string
cột không có giới hạn rõ ràng, Rails sẽ thêm một :limit => 255
ngầm định . Nhưng nếu bạn sử dụng text
, bạn sẽ nhận được bất kỳ loại chuỗi có độ dài tùy ý nào mà cơ sở dữ liệu hỗ trợ. PostgreSQL cho phép bạn sử dụng varchar
cột không có độ dài nhưng hầu hết cơ sở dữ liệu sử dụng một loại riêng biệt cho điều đó và Rails không biết về varchar
không có chiều dài. Bạn phải sử dụng text
trong Rails để lấy text
trong PostgreSQL. Không có sự khác biệt trong PostgreSQL giữa một cột loại text
và một loại varchar
(but varchar(n)
là khác nhau). Hơn nữa, nếu bạn đang triển khai trên PostgreSQL, không có lý do gì để sử dụng :string
(AKA varchar
) ở tất cả, cơ sở dữ liệu xử lý text
và varchar(n)
giống nhau bên trong ngoại trừ các ràng buộc về độ dài bổ sung cho varchar(n)
; bạn chỉ nên sử dụng varchar(n)
(AKA :string
) nếu bạn có một ràng buộc bên ngoài (chẳng hạn như biểu mẫu của chính phủ nói rằng trường 432 trên biểu mẫu 897 / B sẽ dài 23 ký tự) về kích thước cột.
Ngoài ra, nếu bạn đang sử dụng string
ở bất kỳ đâu, bạn phải luôn chỉ định :limit
như một lời nhắc nhở cho bản thân rằng có một giới hạn và bạn nên xác thực trong mô hình để đảm bảo rằng giới hạn đó không bị vượt quá. Nếu bạn vượt quá giới hạn, PostgreSQL sẽ phàn nàn và đưa ra một ngoại lệ, MySQL sẽ lặng lẽ cắt bớt chuỗi hoặc khiếu nại (tùy thuộc vào cấu hình máy chủ), SQLite sẽ để nó vượt qua nguyên trạng và các cơ sở dữ liệu khác sẽ làm điều gì đó khác (có thể là phàn nàn) .
Ngoài ra, bạn cũng nên phát triển, thử nghiệm và triển khai trên cùng một cơ sở dữ liệu (thường sẽ là PostgreSQL tại Heroku), thậm chí bạn nên sử dụng các phiên bản tương tự của máy chủ cơ sở dữ liệu. Có những khác biệt khác giữa các cơ sở dữ liệu (chẳng hạn như hoạt động của GROUP BY) mà ActiveRecord sẽ không cách ly bạn. Bạn có thể đã làm điều này rồi nhưng tôi nghĩ dù sao thì tôi cũng sẽ đề cập đến nó.
Cập nhật :Các phiên bản ActiveRecord mới hơn không hiểu varchar
không có giới hạn, vì vậy, với PostgreSQL ít nhất, bạn có thể nói:
change_column :your_table, :your_column, :string, limit: nil
để thay đổi varchar(n)
cột thành varchar
. text
và varchar
vẫn giống như PostgreSQL có liên quan nhưng một số trình tạo biểu mẫu sẽ xử lý chúng theo cách khác:varchar
nhận được một <input type="text">
trong khi text
nhận được một <textarea>
nhiều dòng .