需要活动-无
管理活动后端结构的纳米.
司马
create_table :neeto_activities_engine_activities, id: :uuid do |t|
# Parent association for the activity, example: Ticket
t.references :trackable, polymorphic: true, index: true, type: :uuid
# Performer of the activity, example: User
t.references :performer, polymorphic: true, type: :uuid
# Unique key per activity that can be used in translations to render on UI
t.string :key
# Any additional details that might be helpful for building the translations or debugging purpose
t.jsonb :metadata, default: {}
t.timestamps
end
使用量
示例
检查为 更新车票状况 {\fn华文仿宋\fs16\1cHD1D1D1}在德克岛.
#<NeetoActivitiesEngine::Activity:0x000000013237f158> {
:id => "d0458158-68d1-423f-b364-d22a8916f6d0",
:key => "activity.ticket.update.status",
:trackable_type => "Ticket",
:trackable_id => "c5104a50-2eff-49a3-accb-f2fa8f4fc1f7",
:performer_type => "User",
:performer_id => "b028d29e-f40a-4c09-9222-357cfe84e2c3",
:created_at => Mon, 30 Oct 2023 10:23:26.705884000 UTC +00:00,
:updated_at => Mon, 30 Oct 2023 10:23:26.705884000 UTC +00:00,
:metadata => {
"new_value" => "trash",
"old_value" => "open"
}
}
关切
我们有一个关切,可以列入需要跟踪这些活动的模式, 这一关切增加了协会和帮助者的方法,使创建活动变得容易.
参考: 新活动引擎:可追踪
示例
class User
include NeetoActivitiesEngine::Trackable
after_save :log_account_block_activity!, if: :blocked?
private
def log_account_block_activity!
old_value, new_value = saved_change_to_blocked_at
key = new_value ? "activity.user.blocked" : "activity.user.unblocked"
metadata = { performer_name: User.current&.name }
log_activity!(key:, metadata:, performer: User.current)
end
end
复杂执行
netoDesk需要很多定制的机票活动, 为了实现它, 我们制造了另一个令人关切的问题,除了上述关切之外,还起作用.
用法 :
class Ticket
include NeetoActivitiesEngine::Trackable
include Trackable::Tickets # Depends on NeetoActivitiesEngine::Trackable
end
使用不同的提供者
使用 User.current 这不是一个好的做法,
它也不适合所有的地方.
例: 在neetoDesk,自动化规则可以更新入场券,
艺人来了 Automation::Rule 没有 User。 。 。 .
为了克服这个问题,我们 activity_performer attr 访问器.
class Ticket
include NeetoActivitiesEngine::Trackable
after_save :log_status_activity!, if: :saved_change_to_status?
private
def log_status_activity!
old_value, new_value = saved_change_to_status
key = "activity.ticket.status.update"
metadata = { old_value:, new_value: }
log_activity!(key: , metadata:, performer: activity_performer)
end
end
ticket.activity_performer = Automation::Rule.first
ticket.update(status: :closed)
在特殊情况下跳过活动?
职业上,商业逻辑要求跳出活动.
为此,我们增加了 skip_activity 关心的用户.
示例 假设您在更新 Rails 控制台的票时想要跳过活动 .
class Ticket
include NeetoActivitiesEngine::Trackable
after_save :log_status_activity!, if: :saved_change_to_status?
private
def log_status_activity!
old_value, new_value = saved_change_to_status
key = "activity.ticket.status.update"
metadata = { old_value:, new_value: }
log_activity!(key: , metadata:, performer: activity_performer)
end
end
# rails c
ticket.skip_activity = true
ticket.update(status: :closed)
父日志活动
有时某项活动属于母资源或另一种资源,而不是活动所触发的模型.
示例:任务可以属于协议,任务活动应当记录在协议上.
class Deal
include NeetoActivitiesEngine::Trackable
...
end
class Task
include NeetoActivitiesEngine::Trackable
belongs_to :deal
after_update :log_task_activity!, if: :saved_change_to_status?
private
def log_task_activity!
old_value, new_value = saved_change_to_status
key = "activity.task.status_updated"
metadata = { old_value:, new_value: }
log_activity_on_parent!(
key:,
parent: deal,
metadata:,
performer: User.current
)
end
end