2012-04-23 17 views
7

Tôi có một bảng có một cột thuộc loại văn bản. Có một chuỗi nhỏ trong nó cần được tuần tự như một mảngRails: Làm thế nào để xử lý "Thuộc tính được coi là một mảng, nhưng là một String" lỗi?

serialize :image_urls, Array 

Có những lúc SQL chỉ là nhanh hơn để chèn dữ liệu. Khi điều này là trường hợp, tôi làm các việc chèn như là một chuỗi

["image1.jpg", "image2.jpg"] 

Kể từ khi tôi chèn một chuỗi Rails của tôi ứng dụng bị treo khi nó cố gắng để đọc dữ liệu, với các thông báo lỗi sau:

Attribute was supposed to be a Array, but was a String 

Có cách nào để không có lỗi này được ném hoặc để nắm bắt và chuyển đổi dữ liệu không?

Tôi muốn chuyển chuỗi thành mảng chỉ là một cuộc gọi đơn giản, vì vậy, điều này sẽ dễ dàng. Tôi chỉ không biết ở đâu, hoặc làm thế nào để hoàn thành nó.


Tôi nghĩ loại ghi đè object_from_yaml, nhưng tôi không chắc chắn nên làm việc này ở đâu.
Tôi có đi đúng hướng không?

Trả lời

5

Từ fine manual:

serialize(attr_name, class_name = Object)
[...] Các serialization được thực hiện thông qua YAML.

Vì vậy cột phải chứa phiên bản YAMLized của image_urls nhưng '["image1.jpg", "image2.jpg"]' không phải là mảng YAML. Nếu bạn muốn muck xung quanh với dữ liệu serialized thô sau đó bạn nên sử dụng một cái gì đó như

["image1.jpg", "image2.jpg"].to_yaml 
# ---------------------------^^^^^^^ 

để tạo chuỗi.

Hoặc tốt hơn, hãy ngừng sử dụng serialize hoàn toàn có lợi cho một bảng riêng biệt.

+0

Dữ liệu quá phức tạp để bình thường hóa. Hoặc cũng sẽ là một nỗi đau đúng, bởi vì tôi phải có hàng chục bảng thực sự nhỏ (ví dụ này là với một trường, nhưng có một số ít trong bảng) – baash05

+0

Có cách nào để ghi đè lên hàm đang ném lỗi không? – baash05

+0

@dave: Sửa dữ liệu trong cơ sở dữ liệu của bạn: bạn đã phá vỡ nó, bạn đã mua nó. –

2

Trong Rails 4 nó làm việc cho tôi mà không cần bất kỳ .to_yaml, chỉ cần thêm nó vào params mạnh như image_urls: []

0

bạn có thể thử như thế này: {: serialized_attribute_name => []}. Và đừng quên thêm điều này vào bộ điều khiển thích hợp làm thông số mạnh. Nó giúp tôi khi tôi gặp vấn đề tương tự.

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