ActiveRecord và lỗi kết nối không tìm thấy bảng trong DB

Đăng bởi Lưu Đại vào ngày 18-12-2022

Rails Active Record là gì? 

Rails Active Record là một ORM (object relational mapping) chịu trách nhiệm làm cầu nối giữa dữ liệu database và object trong App. Nó mang cả dữ liệu được lưu trong db lẫn các phương thức để chương trình tương tác với các dữ liệu đó (select, update, insert, delete) Ngoài ra nó còn thể hiện quan hệ giữa các object với nhau (has_many, has_one, belongs_to). 

Cách đặt tên của ActiveRecord 

Mặc định một model (kế thừa từ ActiveRecord) trong Rails sẽ gán biến self.table_name = self.name.underscore.pluralize(lưu ý cả 2 hàm này đều là hàm của Rails). Có nghĩa là nó sẽ lấy tên model và chuyển nó thành dạng số nhiều. Mình đã từng gặp trường hợp tên bảng và tên model không match với nhau. Cụ thể là tên bảng trong db là equipments với tên model là Equipment. Khi đi qua hàm pluralize equipment sẽ được convert thành …. equipment =))) Khi truy vấn trong db sẽ raise lỗi vì không tìm thấy bảng. Nguyên do là trong tiếng anh equipment không có số nhiều vậy nên để có thể dùng tốt Rails thì nên tìm hiểu kĩ về các dạng số ít số nhiều trong tiếng Anh. 

Fix lỗi khi đã lỡ migrate bảng 

Trong trường hợp kể ở phần 2 nếu không thể sửa tên bảng thì có thể áp dụng một trong những cách sau: 
  • Viết chèn tên bảng trong model self.table = ‘equipments’ đây có lẽ là cách an toàn nhất vì độ ảnh hưởng thấp giới hạn chỉ trong model của mình, tuy nhiên khi tạo các file migrate có reference tói bảng equipment thì ta luôn phải định nghĩa lại foreign_key. foreign_key: { to_table: equipment }
  • Viết chèn rule của inflections tuy nhiên cách này lại khá nguy hiểm do ta không nắm rõ được là những keyword nào đang được sử dụng trong các lib của Rails. Rủi mà trùng một keywords nào đó làm hệ thống bị lỗi thì việc nguyên nhân có thể tốn nhiều thời gian. 
  • Backup db và các bảng liên kết liên quan và tiến hành migrate lại tên bảng =))). 

Kết luận 

Nên cẩn thận trong việc dùng các tính năng tự động của Rails tuy rất tiện dụng nhưng nó lại tiềm ẩn nhiều rủi ro. 
Nên đọc tài liệu cẩn thận trước khi sử dụng một tính năng nào đó trong Rails