Sự khác nhau giữa update, update_columns, update_column, update_attributes, update_attribute trong rails

Là một newbie về Rails, hoặc đang học Rails qua các tutorial có lẽ việc update một record vơi bạn chỉ đơn giản là dùng update_attributes hay update. Nhưng một ngày đẹp trời, bạn được sếp hỏi "update_attribute và update_attributes khác nhau như thế nào?", rồi sau đó lòi đâu ra "em biết update_column không?" Quá choáng váng về số phận, bạn google và nhận ra, cái quái gì chỉ là update mà nhiều hàm đến vậy. Bài viết sau mình xin chỉ ra một số hàm update mình đã google được và phân biệt sự khác nhau giữa chúng.

update(id, attributes)

Đây là public class method bạn gọi trực tiếp từ model class. Có 2 tham số truyền vào là id và 1 hash các attributes. Hàm này sẽ thực hiện update các attributes của record chứa id tương ứng.

# Ví dụ
User.update(1, {name: "Le Quang Canh", email: "[email protected]"})
# Vì hash là params nằm cuối nên có thể bỏ {}
User.update(1, name: "Le Quang Canh", email: "[email protected]")

Để update nhiều hơn 1 record, bạn truyền vào 2 params là 2 mảng id và attributes, trong đó thứ tự phải sắp xếp đúng. Ví dụ

User.update([1,2], [{name: "user1", email: "[email protected]"}, {name: "user2", email: "[email protected]"}])

Có một hàm cùng cha khác ông nội với hàm này là update!(id, attributes) chỉ khác 1 chỗ là hàm này sẽ raise exception nếu update không thành công, còn hàm update sẽ return false

update_attributes(attributes)

Hàm này có lẽ đã quá quen thuộc rồi. Nó được gọi từ một object của model class. Hàm thực hiện update tất cả các attributes được truyền vào từ params của object đó nếu pas validate. Ví dụ

user = User.find_by id: 1
user.update_attributes name: "Canh", email: "[email protected]"

update_attribute(name, value)

Hàm này cũng được gọi bởi một object của class model Nó chỉ có thể update một attribute của object đó. Tuy nhiên, có một số thứ đặc biệt ở đây:

  • Trường được update sẽ bị bỏ qua validate
  • Callback vẫn chạy
  • updated_at vẫn được cập nhật Ví dụ
# Giả sử ta có trường email được validate đúng định dạng email trong model User
user = User.first
user.update_attribute :email, "abc"
=> true

update_columns(attributes)

Tương tự như update_attributes. Tuy nhiên, hàm này nó sẽ update trực tiếp vào DB. Và:

  • Bỏ qua validate
  • Callback không thực thi
  • updated_at không được cập nhật Ví dụ
user = User.first
user.update_columns email: "abc"
=> true

Cũng như update, update_attributes cũng có một hàm tương tự là update_attributes! và khác nhau ở trả về khi update fail

update_column(name, value)

Tương tự như update_column. Cũng như update_columns nó sẽ update trực tiếp vào DB và bỏ qua validate, bỏ qua callback, gọi cập nhật updated_at Ví dụ

user = User.first
user.update_column :email, "abc"
=> true

Bài viết này mình đã liệt kê ra một số hàm update trong rails và so sánh sự khác nhau giữa chúng. Về cơ bản thì mục đích cuối cùng vẫn là update 1 hoặc nhiều record. Tuy nhiên tùy vào mục đích cụ thể trong từng trường hợp mà lựa chọn cho mình hàm phù hợp nhất. Nguồn: http://apidock.com/rails/ActiveRecord


All Rights Reserved