Rails - Activity Log lấy thông tin đối tượng bị tác động?
Em đang những bước đầu học Rails nên nếu câu hỏi có phần cơ bản thì cũng mong mọi người bớt chút thời gian giúp đỡ em ạ.
Em đây xây dựng 1 chức năng Activity Log cho ứng dụng Rails. Dạng như gem public_activity gem này ( https://github.com/chaps-io/public_activity )
Có 1 vấn đề như thế này.
Web em có các dữ liệu liên quan đến bài viết, hình ảnh. Đây là 2 đối tượng khác nhau. Do đó photo và post là 2 table riêng biệt. Cũng như cấu trúc LINK của chúng là khác nhau khi show, edit. Cơ bản nó có 3 trường này.
Table photo. ID, title, description
Table post. ID, title, content
Ở đây table Activity của em cơ bản sẽ có các trường như sau
ID user_id : Xác định user thực hiện hành động affected_id : Xác định ID của đối tượng bị tác động. ( Ở đây là post và photo)
Khi em hiển thị trang Feed Activity. Là show get tất cả Activity.all()
Nhưng em muốn nó mô tả log dạng như này:
VD: Nếu là bài viết đã được tạo thì sẽ có dạng
Hùng đã tạo bài viết từ một phía cũng là tình yêu ( Tức là có thể hiển thị được tên của bài viết đã được tạo và LINK của post đó luôn. anchor text ý ạ)
Còn nếu là tạo hình ảnh thì sẽ có dạng Hùng đã đăng hình ảnh nữ sinh trong trang phục áo dài ( Cũng hiển thị title ảnh và link dẫn đến hình ảnh)
Cái thắc mắc đặt ra của em ở đây là cái trường để xác định bài viết hay hình ảnh chỉ là 1 cái ID được lưu trong Activity. Làm sao để xác định được nó là thuộc của post hay photo để mà mình get được thông tin??
1 CÂU TRẢ LỜI
Em có thể thêm 1 cột để lưu type
của đối đượng vào trong bảng activities
. Và nếu đã làm vậy thì anh nghĩ em nên dùng tính năng Polymorphic Associations của Rails.
Giả sử bảng activities
mới có cấu trúc và nội dung như này (anh dùng target_id
thay cho affected_id
)
id | user_id | target_id | target_type |
---|---|---|---|
1 | 1 | 1 | Post |
2 | 1 | 1 | Photo |
Lưu ý: target_type
là dạng String và chứa tên các model Post
hoặc Photo
.
Trong model Activity
định nghĩa association target
như này
class Activity < ApplicationRecord
belongs_to :target, polymorphic: true
end
thì khi gọi activity.target
nó sẽ tự động trả về object của class Post
hoặc Photo
tuỳ thuộc vào giá trị của activity.target_type
.
Với dữ liệu trong bảng trên thì
Activity.first.target # => trả ra Post object với id = 1
Activity.second.target # => trả ra Photo object với id = 1
Mặt khác, khi tạo activity mới chỉ cần gọi
user = User.find(...)
post = Post.find(...)
Activity.create user: user, target: post
thì các giá trị target_id
và target_type
cũng sẽ được tự động set.
Em cảm ơn anh nhiều. Đúng cái em cần ạ, và câu trả lời cũng đã rất chi tiết và dễ hiểu. Cũng như giúp em biết thêm về Polymorphic trong rails