Một số thay đổi trong Active Record của Rails 6

Tram Ho

1. ActiveRecord::Relation#pick

Trước Rails 6
Pluck được sử dụng để lấy ra một mảng của attribute value khi query, giúp giảm step loop qua từng phần tử trong mảng ActiveRecord

Pluck.first sẽ lấy ra phần tử đầu tiên của mảng.

Rails 6
Pick được sử dụng thay Pluck.first với mục đích là lấy ra phần tử đầu tiên của mảng

2. ActiveRecord::Base.create_or_find_by/!

create_or_find_by rails 6 là method thay cho find_or_create_by khi nó thay đổi thứ tự từ select->insert thành insert->select để tránh race condition khi sử dụng find_or_create_by trong các ứng dụng cần high scale.

Nếu một bản ghi đã tồn tại với các ràng buộc duy nhất, sẽ đưa ra một ngoại lệ giống việc sử dụng find_by.
Giả sử có 2 bảng với ràng buộc như sau

Sử dụng create_or_find_by

Raise ngoại lệ với create_or_find_by!

3. Enum

Enum được sử dụng nhiều để đặt tên cho scope. Trong Rails 6 để đặt tên cho scope với ý nghĩa lấy ra phủ định ta có thể sử dụng not_*

4. update_columns

update_columns trong Rails được sử dụng để update record mà bỏ qua các điều kiện (validate) của thuộc tính.

Rails 6 khi sử dụng update_columns cho thuộc tính không tồn tại sẽ raise lên lỗi ActiveModel::MissingAttributeError.

Ở các phiên bản rails 4 hay rails 5 thì trong trường hợp này sẽ raise lên lỗi ActiveRecord::StatementInvalid

5. delete_by and destroy_by

Rails có find_or_create_by, find_by và các phương thức tương tự để tìm giá trị đầu tiên và tạo nếu không tìm thấy bản ghi khớp với các tham số đã cho.

Rails bị thiếu tính năng tương tự để xóa/hủy một record phù hợp điều kiện, ở các bản Rails trước chỉ hỗ trợ phương thức destroy và delete_all để xóa tất cả các record.

Rails 6 đã bổ sung việc xóa/hủy một record được tìm thấy với điều kiện cho trước với 2 phương thức là delete_by and destroy_by

6. ActiveRecord::Relation#touch_all

Trong Rails, phương thức touch được sử dụng để update trường updated_at từ thời gian mặc định để current time. Không có validate và chỉ có các callback after_touch, after_commit, and after_rollback được thực hiện.

Rails 6 đã thêm phương thức touch_all trong ActiveRecord::Relation để touch vào nhiều bản ghi cùng một lúc.

Trước Rails 6, cần lặp lại trên tất cả các bản ghi bằng cách sử dụng một trình vòng lặp. Kết quả sẽ trả về một mảng ActiveRecords.

Với Rails 6 thì phương thức touch_all sẽ trả về số lượng của ActiveRecords

Ngoài ra, touch_all còn lấy custom_time hoặc tham số khác ở các cột như ở ví dụ dưới

Cảm ơn các bạn đã theo dõi đến đây!!!

Nguồn tham khảo:
https://www.botreetechnologies.com/blog/notable-activerecord-changes-in-rails-6-part-1
https://www.botreetechnologies.com/blog/notable-activerecord-changes-in-rails-6-part-2

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo