================================================== =========================
Cập nhật: ngày 19 tháng 7 năm 2017
Bây giờ tài liệu Rails cũng đề xuất sử dụng super
như thế này:
class Model < ActiveRecord::Base
def attribute_name=(value)
# custom actions
###
super(value)
end
end
================================================== =========================
Câu trả lời gốc
Nếu bạn muốn ghi đè các phương thức setter cho các cột của bảng trong khi truy cập thông qua các mô hình, đây là cách để làm điều đó.
class Model < ActiveRecord::Base
attr_accessible :attribute_name
def attribute_name=(value)
# custom actions
###
write_attribute(:attribute_name, value)
# this is same as self[:attribute_name] = value
end
end
Xem Ghi đè người truy cập mặc định trong tài liệu Rails.
Vì vậy, phương pháp đầu tiên của bạn là cách chính xác để ghi đè các setters cột trong Mô hình của Ruby on Rails. Các bộ truy cập này đã được Rails cung cấp để truy cập vào các cột của bảng dưới dạng các thuộc tính của mô hình. Đây là những gì chúng ta gọi là ánh xạ ORM ActiveRecord.
Cũng nên nhớ rằng attr_accessible
ở đầu mô hình không liên quan gì đến người truy cập. Nó có một chức năng hoàn toàn khác nhau (xem câu hỏi này )
Nhưng trong Ruby thuần túy, nếu bạn đã xác định các trình truy cập cho một lớp và muốn ghi đè trình thiết lập, bạn phải sử dụng biến thể hiện như thế này:
class Person
attr_accessor :name
end
class NewPerson < Person
def name=(value)
# do something
@name = value
end
end
Điều này sẽ dễ hiểu hơn một khi bạn biết những gì attr_accessor
làm. Mật mãattr_accessor :name
này tương đương với hai phương thức này (getter và setter)
def name # getter
@name
end
def name=(value) # setter
@name = value
end
Ngoài ra phương thức thứ hai của bạn không thành công vì nó sẽ gây ra một vòng lặp vô hạn khi bạn đang gọi cùng một phương thức attribute_name=
bên trong phương thức đó.