12/08/2018, 16:11

Dirty in Active model

1. attribute_change và saved_change_to_attribute: Cả 2 phương thức đều được dùng để lấy ra mảng giá trị gồm giá trị hiện tại được lưu trong database và giá trị hiện tại (chưa được save) của một thuộc tính, trả về giá trị nil nếu một thuộc tính có giá trị không thay đổi. Tuy nhiên phương ...

1. attribute_change và saved_change_to_attribute:

  • Cả 2 phương thức đều được dùng để lấy ra mảng giá trị gồm giá trị hiện tại được lưu trong database và giá trị hiện tại (chưa được save) của một thuộc tính, trả về giá trị nil nếu một thuộc tính có giá trị không thay đổi.
  • Tuy nhiên phương thức saved_change_to_attribute chỉ được sử dụng trong phiên bản Rails từ 5.1.
Giả sử bảng users gồm các thuộc tính: name, email.
user  = User.new                             # lúc này thuộc tính email sẽ có giá trị là nil
user.email = "123@gmail.com"
=> user.email_change                   #kết quả:  [nil, "123@gmail.com"]
user.save 
user.email_change                       #kết quả: nil
user.email = "test@gmail.com"
user.email_change                       #kết quả: ["123@gmail.com", "test@gmail.com"]

2. attribute_changed? và saved_change_to_attributed?:

  • Các method này sẽ trả về giá trị kiểu boolean:
    • Trả về true nếu nếu thuộc tính có sự thay đổi về giá trị (giữa giá trị được lưu trong database và giá trị được gán ở hiện tại nhưng chưa save).
    • Ngược lại, trả về false.
  • Tuy nhiên phương thức saved_change_to_attribute? chỉ được sử dụng trong phiên bản Rails từ 5.1.
   user = User.create name: "user1", email: "user1@gmail.com"
   user.name = "test"
   => user.name_changed?                                   #trả về giá trị true.
   => user.name_changed?                                   #trả về false.
  user.update_attributes name: "user2"
  => user.name_changed?                                    #trả về false do khi gọi method update_attributes thì giá trị của thuộc tính name đã được lưu.

Phương thức này thường được dùng trong model để validate(dựa trên sự thay đổi của một thuộc tính cụ thể thay vì dùng on: :update trên bất kì một thuộc nào của object.) hoặc xét điều kiện khi gọi callback.

    validates :name, length: {maximum: 30}, on: :name_changed?           
    #chỉ kiểm tra maxlength của thuộc tính name trong trường hợp người dùng nhập(thay đổi) giá trị cho trường name.

3. attribute_was:

  • attribute_was: dùng để lấy ra giá trị trước đó của một thuộc tính.
   user = User.create name: "user1", email: "user1@gmail.com"
   user.update_attributes name: "user2"
   => user.name_was                                              #kết quả: user1.
  • Thường dùng để kiểm tra sự thay đổi của một thuộc tính trong model:
Ví dụ: Kiểm tra password được nhập vào có trùng với password của user trong trường
    hợp yêu cầu user xác thực password trước khi edit thông tin(email hoặc password):
validate :check_password_edit_infomation?, if: (:email_changed? || :password_changed?)

def check_password_edit_infomation?
    if password_was == password
        true
    else
        false
    end
end
0