5

Tôi đang sử dụng mô hình STI với một bảng "Tài khoản" duy nhất để giữ thông tin cho Người dùng và Kỹ thuật viên (tức là Tài khoản < Tài khoản, Kỹ thuật <). Mọi thứ hoạt động từ góc độ chức năng, nhưng mọi thứ nổ tung khi chạy thử nghiệm đơn vị:Ruby on Rails Bảng đơn Thừa kế (STI) và bài kiểm tra đơn vị (với PostgreSQL)

... 8) Lỗi: test_the_truth (UserTest): ActiveRecord :: StatementInvalid: PGError: ERROR: mối quan hệ "kỹ thuật viên" không tồn tại : XÓA TỪ "kỹ thuật viên" ...

Về cơ bản, khung tiêu chuẩn không nhận ra rằng bảng Kỹ thuật và người dùng (hoặc "quan hệ" như PostgreSQL gọi họ) không tồn tại và, trên thực tế, nên được đặt bí danh cho Tài khoản.

Bất kỳ ý tưởng nào? Tôi khá mới đối với RoR và tôi đang thua lỗ như thế nào để sửa lỗi này mà không cần tách STI ra.

+0

Bạn có thể đăng cả bài kiểm tra đơn vị đang tạo ra lỗi và phương thức mà nó đang gọi khi lỗi xảy ra không? –

Trả lời

12

Hóa ra rằng vấn đề là do sự hiện diện của:

./test/fixtures/technicians.yml ./test/fixtures/users.yml

này có ý nghĩa như khuôn khổ dự kiến ​​có thể chèn dữ liệu vào các bảng có tên tương tự.

+1

<3 ngăn xếp tràn. Ước gì tôi có thể mod bạn nhiều hơn nữa! – nfm

0
  • Bạn có chắc chắn bảng tài khoản của mình có cột 'loại' không? Bạn cần một cái để làm cho STI hoạt động.
  • Tôi đã thực sự gặp một số sự cố về tính tương thích của cơ sở dữ liệu với một cột được gọi là 'loại' và thỉnh thoảng chuyển thành 'loại' để giảm bớt điều đó. Đó có thể là vấn đề; thử đặt self.inheritance_column = "loại" trong lớp cơ sở (Tài khoản) và xem có giúp được không.
+0

Tài khoản đã bao gồm cột "loại" và, thật không may, đề xuất của bạn để đổi tên thành "loại" không giúp được gì; các vấn đề vẫn tồn tại. –

2

Tôi đã gặp sự cố tương tự đã được giải quyết bằng cách xóa tệp YAML cho mô hình con. Về cơ bản đường ray là nhìn vào các đồ đạc được tạo ra trong/test/fixtures/và cố gắng để làm trống các bảng cho mỗi để nó có thể tải lại chúng cho bạn.

Trong trường hợp của tôi, tôi đã chạy lệnh tạo kịch bản lệnh/tạo mô hình tự động tạo một lịch thi đấu mới. Sau đó, tôi đã thay đổi mô hình để kế thừa từ lớp cha mẹ thích hợp. Vâng, kể từ khi trận đấu vẫn còn tồn tại, đường ray đã cố gắng để DELETE FROM trẻ em trước khi tải đồ đạc.

Nếu bạn thực sự cần tải trước dữ liệu, bạn nên sử dụng lịch thi đấu của mô hình gốc và đặt trường loại thành tên mẫu thích hợp.

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