销毁特定模型时Stream Rails提示activity_owner_id未找到及相关配置问题
问题描述
我按照Michael Hartl的Rails教程搭建了用户关注/被关注的关系,同时集成了GetStream来在用户被关注时生成通知。我的Relationship模型代码如下:
class Relationship < ApplicationRecord belongs_to :follower, class_name: "User" belongs_to :followed, class_name: "User" validates :follower_id, presence: true validates :followed_id, presence: true default_scope { order(created_at: :desc) } include StreamRails::Activity as_activity def activity_actor self.follower # 这里可能有未完成的代码 ...
但现在销毁某个Relationship实例时,出现了「activity_owner_id not found」的错误,请问该怎么解决?
解决方案
这个错误通常是因为StreamRails在处理模型销毁操作时,无法找到对应activity的所有者信息导致的。下面是几个针对性的修复步骤:
1. 完善Activity相关方法
首先确保你完整实现了StreamRails要求的Activity方法,activity_actor需要明确返回关联用户,同时补充activity_object和activity_owner来明确activity的结构:
class Relationship < ApplicationRecord # 已有的代码... include StreamRails::Activity as_activity def activity_actor self.follower # 明确返回关注者作为activity的发起者 end def activity_object self.followed # 被关注者作为activity的关联对象 end def activity_owner self.followed # 设置被关注者为activity的所有者,确保销毁时能定位到对应feed end end
StreamRails依赖这些方法构建和管理activity,缺失或不完整的实现会导致销毁时找不到关键关联信息。
2. 添加stream_activity_id字段(如果缺失)
如果你的Relationship模型没有存储Stream activity ID的字段,StreamRails在销毁时无法定位到要删除的activity。可以生成迁移添加这个字段:
rails generate migration AddStreamActivityIdToRelationships stream_activity_id:string rails db:migrate
这个字段会由StreamRails自动填充,用于关联模型实例和对应的Stream activity。
3. 手动处理销毁时的Activity删除
如果自动销毁机制仍然有问题,可以在模型中添加before_destroy回调,直接调用Stream API清理对应的activity:
class Relationship < ApplicationRecord # 已有的代码... before_destroy :remove_stream_activity private def remove_stream_activity client = StreamRails.client # 获取发起者的用户feed follower_feed = client.feed('user', self.follower.id) # 获取被关注者的通知feed(如果需要清理通知) followed_notification_feed = client.feed('notification', self.followed.id) # 通过foreign_id定位到对应的activity(格式为"模型名:ID") activity_foreign_id = "relationships:#{self.id}" # 从发起者feed中移除 follower_feed.remove_activity(foreign_id: activity_foreign_id) # 从被关注者的通知feed中移除(如果通知存在的话) followed_notification_feed.remove_activity(foreign_id: activity_foreign_id) end end
这种方式绕过了StreamRails的自动处理逻辑,直接通过API清理目标activity,避免找不到owner的问题。
4. 检查StreamRails初始化配置
确保你的config/initializers/stream_rails.rb配置正确,尤其是用户模型的关联设置:
StreamRails.configure do |config| config.api_key = ENV['STREAM_API_KEY'] config.api_secret = ENV['STREAM_API_SECRET'] config.app_id = ENV['STREAM_APP_ID'] config.location = 'us-east' # 替换为你的实际区域 # 确保当前用户方法正确设置 config.current_user_method = :current_user end
错误的配置也可能导致StreamRails无法正确识别模型的关联关系。
内容的提问来源于stack exchange,提问作者Yogen Aggarwal

