2012-01-31 24 views
7

Chúng tôi đã gặp sự cố trong Rails 3.1 khi chúng tôi chạy trong chế độ phát triển. Có vẻ như các mô hình của chúng tôi đôi khi được tải lại giữa yêu cầu và một object_id mới được đặt trên các lớp của mô hình của chúng tôi. Mà sau đó dẫn đến một ActiveRecord :: AssociationTypeMismatchCác mô hình đường ray được tải lại giữa yêu cầu dẫn đến AssociationTypeMismatch

ActiveRecord :: AssociationTypeMismatch Character (# 2194222580) mong đợi, có Character (# 2185863000)

Nếu chúng ta quay config.cache_classes = true trong development.rb vấn đề dường như đi nhưng không thực tế để phát triển như vậy vì chúng tôi sẽ phải liên tục khởi động lại máy chủ của mình.

Bất kỳ ai có ý tưởng tại sao các mô hình có thể được tải lại giữa yêu cầu hoặc nếu chúng tôi có thể buộc bộ nhớ cache kéo dài qua toàn bộ yêu cầu?

+1

thử gem active_reload là bộ nhớ cache của mô hình và hết hạn khi bất kỳ thay đổi nào được thực hiện trong chế độ dev.I không biết tại sao nó thay đổi thời gian chạy.can u thử và cho tôi biết trợ giúp này cho sự cố cuối cùng – Amar

+0

Tôi nghĩ rằng giao diện như nó đang hoạt động, chúng ta đang ở trên đường ray 3.1 ngay bây giờ và rõ ràng active_reload được bao gồm theo mặc định trong đường ray 3.2. Hơi khó để tái tạo, nhưng tôi sẽ cập nhật câu hỏi này nếu có vẻ như nó đã biến mất sau một vài ngày. – aproctor

+0

active_reload không hoạt động không may. Mặc dù chúng tôi có thể đã không cấu hình nó đúng cách – aproctor

Trả lời

1

Với config.cache_classes = false, mọi thay đổi đối với mô hình sẽ tải lại. Điều này bao gồm việc xác định/xác định lại một hằng số được xác định trong/được biết đến với mô hình.

Chúng tôi đã gặp sự cố này khi sử dụng rspec và ActsAsFu. Định nghĩa lại lớp Fu trong quá trình kiểm tra gây ra các lớp liên quan (thậm chí gián tiếp liên quan) để tải lại, và chúng tôi đã nhận được lỗi ActiveRecord :: AssociationTypeMismatch trên đối tượng liên quan. Chúng tôi đã tìm ra điều này bởi vì chúng tôi đã có các thử nghiệm chạy tốt một mình, nhưng không thành công khi chạy sau các thử nghiệm khác. Giải pháp của chúng tôi là chỉ tạo các lớp Fu được đặt tên riêng cho mỗi cấu hình và tránh gán lại tên lớp trong khi kiểm tra.

Vì vậy, lời khuyên của tôi là để đảm bảo bạn không xác định lại bất kỳ hằng biết đến lớp nhân vật của bạn (hoặc gọi đến các lớp học được biết đến với lớp nhân vật của bạn, vv)

+1

Điều này dường như chỉ là một phần khác với lời giải thích của @ stuartc. (ví dụ: các bản vá lỗi xác định lại định nghĩa Mô hình, HOẶC định nghĩa của các mô hình liên quan.) Cùng một cơ chế ... thay đổi mô hình kiểm tra giữa các lực lượng tải lại tầng. –

0

Trong quá khứ tôi đã phát hiện ra rằng mở lại (khỉ vá) một mô hình ActiveRecord sẽ thực sự tải lại toàn bộ lớp từ trên xuống dưới. Thử tìm kiếm codebase của bạn cho nhiều trường hợp của class Character.

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