So Sánh Class Method Và Scope
Đặt vấn đề
Trong một thời gian rất lâu, từ khi mới học đến khi làm những ứng dụng đầu tiên. Tôi luôn cho rằng Scope và và Class Method hoàn toàn giống nhau. Và lý do Scope xuất hiện là để giúp mã nguồn ngắn gọn hơn.
Nhưng rõ ràng đấy là một suy nghĩ chưa đúng, dưới đây là điểm cần chú ý về 2 phương thức này.
Luận bàn
Tôi có 1 scope:
1 | class Product < ActiveRecord::Base |
Tôi có 1 class method:
1 | class Product < ActiveRecord::Base |
2 method này là hoàn toàn tương đương nhau, kết quả trả về cũng vậy. Bây giờ thử 1 ví dụ khác.
1 | class Product < ActiveRecord::Base |
Viết ví dụ trên dưới dạng Class Method:
1 | class Product < ActiveRecord::Base |
Tiến hành gọi liên tiếp Scope:
1 | Product.by_type(nil).is_active |
Tiến hành gọi liên tiếp Class Method:
1 | Product.by_type(nil).is_active |
Ủa vậy chuyện này là sao? Tại sao Scope vẫn work bình thường trong khi Class Method lại bắn về một exception?
Đây chính là điểm khác biệt quan trọng của Scopy và Class Method.
Scope luôn luôn trả về một ActiveRecord Relation
. Còn Class Method thì sao? Nếu bạn không cover trường hợp nil/blank thì nó sẽ văng về nil/blank như vậy không thể chạy Class Method phía sau, vì method đó không thể chạy với nil/blank. :smile:
Kết luận
Đây là một kết luận sơ sài được tôi rút ra trong quá trình làm việc. Nếu có sai xót hãy để lại bình luận dưới đây.