Asked Apr 18th, 2018 11:02 AM 114 0 1
  • 114 0 1
0

Rails - Activity Log lấy thông tin đối tượng bị tác động?

Share
  • 114 0 1

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 ANSWERS


Answered Apr 18th, 2018 12:38 PM
Accepted
+3

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_idtarget_type cũng sẽ được tự động set.

Share
Huu Hung @huuhung96
Apr 19th, 2018 3:06 AM

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

+1
| Reply
Share