Vì vậy, tôi có như sau:STI trong Rails: Làm cách nào để thay đổi từ một lớp cha thành một lớp con mà không truy cập thuộc tính "type" trực tiếp?
class Product < ActiveRecord::Base
# Has a bunch of common stuff about assembly hierarchy, etc
end
class SpecializedProduct < Product
# Has some special stuff that a "Product" can not do!
end
Có một quá trình sản xuất và lắp ráp trong đó dữ liệu được chụp về sản phẩm. Tại thời điểm nắm bắt các loại sản phẩm cuối cùng không được biết đến. sau khi hồ sơ sản phẩm đã được tạo ra trong cơ sở dữ liệu (có thể vài ngày sau đó) có thể cần thiết để biến sản phẩm đó thành một sản phẩm chuyên biệt và điền vào thông tin bổ sung. Không phải tất cả các sản phẩm sẽ trở thành chuyên ngành, tuy nhiên.
Tôi đã cố gắng sử dụng như sau:
object_to_change = Product.find(params[:id])
object_to_change.becomes SpecializedProduct
object_to_change.save
Sau đó, khi tôi làm một SpecializedProduct.all
tập kết quả không bao gồm object_to_change
. Thay vào đó object_to_change
vẫn được liệt kê trong cơ sở dữ liệu như Product
UPDATE "products" SET "type" = ?, "updated_at" = ? WHERE "products"."type" IN ('SpecializedProduct') AND "products"."id" = 30 [["type", "Product"], ["updated_at", Fri, 17 May 2013 10:28:06 UTC +00:00]]
Vì vậy, sau khi cuộc gọi đến .becomes SpecializedProduct
phương pháp .save
hiện đang sử dụng đúng loại, nhưng nó không thể cập nhật các bản ghi vì WHERE
khoản của bản cập nhật là quá cụ thể.
Tôi có thực sự cần truy cập trực tiếp thuộc tính type
của mô hình không? Tôi thực sự không thích.
câu trả lời ngắn gọn: có, bạn cần cập nhật bằng loại. Nói chung, STI không được thiết kế để thay đổi các lớp theo thời gian. –