Enum Và Sự Khác Biệt Khi Sử Dụng Giữa Rails 4.x Và Rails 5.x - Code24h
Có thể bạn quan tâm
- Bài viết
- Hỏi đáp
Có thể nói nôm na: Enum là trường được định nghĩa là enum thì sẽ lưu trong DB là số nhưng mà lại có thể được truy xuất bằng chữ Ví dụ : Model User có trường role: [:member, :admin] thì được lưu trong DB tương ứng là 0, 1 nhưng có thể được truy xuất bằng chữ : User.member, User.admin Cú pháp: ...
- Có thể nói nôm na: Enum là trường được định nghĩa là enum thì sẽ lưu trong DB là số nhưng mà lại có thể được truy xuất bằng chữ
- Ví dụ : Model User có trường role: [:member, :admin] thì được lưu trong DB tương ứng là 0, 1 nhưng có thể được truy xuất bằng chữ : User.member, User.admin
- Cú pháp:
-
Nếu trường dùng làm enum nhận giá trị nil và mọi hàm gán cho giá trị này đều trả về False
-
Vì vậy: Trường lưu trữ enum nên để nullable: false và có giá trị mặc định(default):
- Như ta thấy : Ứng với các function admin, member là các scope, nên chúng ta có thể nối thêm các scope khác để truy xuất thuận tiện hơn. Thay vì viết:
Thì ta viết:
User.adminsẽ trực quan và ý nghĩa hơn nhiều. Bên cạnh đó có thể nối thêm các scope hay mệnh đề khác:
User.admin.where(id: 1)-
Đến đây vẫn chưa thấy được sự khác biệt của enum trong rails 4 và rails 5, phần tiếp theo mình xin trình bày sự khác biệt đó. Thử một ví dụ trước nhé để xem sự khác biệt đó.: Ở rails 4:
-
Như chúng ta thấy, cả 2 trường hợp đều cho kết quả không mong muốn, vì bản chất role được lưu vào DB là số, nên khi sử dụng mệnh đề where thì nó convert về dạng int: +) "member".to_i = 0 nên thành ra nó tìm các bản ghi có role là 0 (ứng với admin). +) :member là symbol không có hàm to_i nên nó so sánh role với nil. *Vì vậy lưu ý cho mình : Với rails 4 tuyệt đối không so sánh các trường enum với string hoặc symbol. Còn với rails 5:
-
Như chúng ta thấy, vẫn với câu lệnh như bên kia nhưng kết quả trả về khác hẳn, đúng như những kết quả ta mong muốn. Đây cũng chính là điểm khác biệt mình muốn đề cập tới, những cái gọi là còn "tồn đọng", "khuyết điểm" ở rails 4 tới đây đã được giải quyết.
-
Còn 1 điều khá là nguy hiểm nên mình tách riêng ra ở đây: Vì bản chất rails 4 convert giá trị so sánh về dạng integer trước khi đem so sánh nên sẽ có thể xảy ra trường hợp sau:
-
Rõ ràng là không có thằng nào có role : "adminnn" và cũng không tồn tại "adminnn" trong enum nhưng vẫn select ra được, do "adminnn".to_i = 0.
-
Với rails 5 thì kết quả khác hẳn:
-
Vẫn với lý do như trên bản chất rails 4 convert cái mình truyền vào thành integer sau đó so sánh với 0,1,... Còn rails 5 đã update có cơ chế convert ngược nên không còn xảy ra tình trạng trên.
- Thêm vào ngoài cùng bên phía tay phải
- Khi đó theo logic lưu vào DB: mod ứng với 2, và role các bản ghi trước đó không bị ảnh hưởng. Nhưng giả sử mình thêm :mod vào ngoài cùng tay trái.
- Khi đó :admin từ 0 thành 1, :member từ 1 thành 2 và các bản ghi trước sẽ bị ảnh hưởng
- Vậy câu hỏi đặt ra là : "Tôi muốn đặt "mod" ở đầu tiên mà không làm ảnh hưởng tới các bản ghi trước có được không? "
- Câu trả lời là được vì rails hỗ trợ xét giá trị role theo kiểu Hash
- Và khi đó kết quả lại trở về như cũ và không bị ảnh hưởng gì
- User đầu tiên lại trở về role như ban đầu là "member"
- Enum hỗ trợ lưu trữ trong DB là số nhưng có thể truy xuất qua chữ nên nó rất trực quan.
- Trường lưu trữ Enum không nên để nullable và luôn có giá trị mặc định
- Khi sử dụng rails 4 nên chú ý không được so sánh trực tiếp trường có kiểu enum với string hoặc symbol
- Các key của enum trong cùng 1 class không được trùng nhau và trùng với từ khóa
- Có thể biểu diễn enum dưới dạng Hash
- https://viblo.asia/ta.duy.anh/posts/nwmGyElDGoW
- http://api.rubyonrails.org/classes/ActiveRecord/Enum.html
Hoàng Hải Đăng
24 chủ đề
7226 bài viết
Có thể bạn quan tâm- 1 Một số phép nối bảng trong Mysql
- 2 Chu trình kiểm thử phần mềm
- 3 Nested Classes (P1)
- 4 A simple API using protobuf and gRPC
- 5 LLDB Debugger
- 6 Kiểm thử phần mềm bắt đầu khi nào?
- 7 Space Position pattern - Công nghệ chọn gấu
- 8 Kiến trúc hệ thống trên Laravel – phần 4
- 9 Building a Shopping Cart in Ruby on Rails
- 10 Interface trong Typescript (Phần 1)
Đăng ký nhận thông báo
Các bài học thú vị sẽ được gửi đến inbox của bạn
HỖ TRỢ HỌC VIÊN
- Các câu hỏi thường gặp
- Điều khoản sử dụng
- Chính sách và quy định
- Chính sách bảo mật thanh toán
- Hỗ trợ học viên: hotro@code24h.com
- Báo lỗi bảo mật: security@code24h.com
VỀ CODE24H
- Giới thiệu Code24h
- Cơ hội nghề nghiệp
- Liên hệ với chúng tôi
HỢP TÁC VÀ LIÊN KẾT
- Đăng ký giảng viên
- Giải pháp e-learning
- Chương trình đại lý
- Chương trình Affiliate
KẾT NỐI VỚI CHÚNG TÔI
TẢI ỨNG DỤNG TRÊN ĐIỆN THOẠI
CCode 24h, code mọi lúc, mọi nơi
© Copy right 2018 - 2024
Từ khóa » Cú Pháp Trong Rails
-
Cú Pháp Ngắn Gọn Với Ruby On Rails - Viblo
-
Ruby_Cơ Bản Về Ruby & Ruby On Rails - Viblo
-
Cú Pháp Trong Ruby - Chạy Hello World
-
Xây Dựng ứng Dụng đầu Tiên Của Bạn - Rails Girls
-
Kiến Trúc Của Ruby On Rails - Techmaster
-
Tìm Hiểu Ruby On Rails Là Gì Và đặc điểm Vượt Trội Của Nó - ITNavi
-
It-background-ruby-on-rails-fast-training/ At Master - GitHub
-
Ruby On Rails Là Gì? Các Web Học Ruby On Rails Miễn Phí Mà Chất ...
-
Sử Dụng (&. ) Trong Ruby | TechHay Blog
-
Cấu Trúc Rẽ Nhánh If Unless Case Trong Ruby
-
Có Nên Học Ruby On Rails? - TỰ HỌC LẬP TRÌNH
-
Tìm Hiểu Ruby Trong 25 Phút
-
Làm Cách Nào để Triển Khai Tô Sáng Cú Pháp Rouge Trong Rails?