Tôi không sử dụng phương thức changes
. Nhưng tôi chắc chắn rằng bạn luôn có thể sử dụng phương pháp kỳ diệu <attribute_name>_changed?
và <attribute_name>_was
:
services.any? {|s| s.attribute_name_changed?}
services.map(&:attribute_name_was)
railscast
Xem Ryan Bates cho biết thêm thông tin: #109 episode
CẬP NHẬT: Bạn có thể vượt qua :after_delete
, và :after_add
callbacks để has_many
liên kết trực tiếp:
has_many :items, :after_add => :my_method_or_proc1, :after_remove => :my_method_or_proc2
Be car eful bằng cách sử dụng các callbacks này và chú ý cách chúng hoạt động. Họ được gọi trên items.build
và items.create
sau khi. Vì vậy, nếu bạn gọi items.build
và sau đó lưu đối tượng cha mẹ (với các thuộc tính lồng nhau cho chẳng hạn) after_add
callback sẽ được gọi là một lần duy nhất vào việc xây dựng liên quan đến đối tượng. Điều đó có nghĩa là nếu cha mẹ có xác thực thì việc xây dựng items
sẽ không được lưu trong cơ sở dữ liệu và bạn không thể dựa vào số gọi lại after_add
. Nói cách khác, nó không nói rằng bản ghi của hiệp hội được thêm vào đã được lưu trong DB. Vì vậy, bạn có đảm bảo rằng mục được thêm vào và chỉ được lưu trên cuộc gọi items.create
. Tôi hy vọng bạn hiểu rõ điều này.
Đối với tôi, tính năng này chỉ hoạt động, nếu đối tượng được liên kết được cập nhật. Nó không làm việc cho tôi, nếu đối tượng liên kết được thêm vào hoặc bị loại bỏ (vì nó không còn tồn tại trong liên kết 'services') nữa. Tôi đang làm gì sai? – morgler