Rails 怎么在删除话题的时候关联删除话题里的资源文件?

rennyallen · 2017年11月20日 · 最后由 rennyallen 回复于 2017年11月24日 · 1824 次阅读

比如:

我在 ruby-china 发个帖,我点击 上传了一张图片,这时候会向后台发送一个 POST 请求,把这张图片上传到服务器,然后写入数据库(比如 ruby-china 里面是 photos 这张表)。

好,现在我突然决定不发帖了,退出页面了,或者说我发帖之后把这个帖子删了,但是这张图片依然存在服务器和数据库里面,而这里面的图片已经没用了,有什么办法删掉它吗?

思考:

  • 我看 ruby-china 的 photo 好像是和 user 做的关联
class Photo < ApplicationRecord
  belongs_to :user
end

那么如果有个删帖的功能(真删除),帖子删了之后这些相关图片还是存在的吧?那这样累计下去不会占用很多空间吗?或者说我就一直点上传图片,传很多,但我不发帖,那这些图片有什么办法删掉?

  • 和 topics 表做关联,然后 dependent: :destroy?

这样做的话,那么在 photos 表里面应该有个 topic_id 的字段吧,那么,我在发帖的时候 (topics/new) 这时候新话题还没存入数据库,哪里有 id? 也就是说当上传图片的时候,POST 请求过去,然后执行

@photo = Photo.new
@photo.topic_id = ??

这个 topic 的 id 要等表单提交之后,执行 create action 之后才有 id 呀

然后我就想,那么我在 create topic 之后去修改 photo 的 topic_id? 这时候那一堆 photo 和这个 topic 已经没有关联了啊,那我还怎么能找到这些个指定的 photo?

我不知道我表达清楚没,这东西和帖子&回复啥的不一样,topic has many replies, reply belongs to topic, 在创建回复的时候可以找到这个 topic, 就能 topic.replies.create,但是这个是在 topic 没有创建的时候去操作,创建 photo 需要 topic, 而 topic 还没创建,等 topic 创建了,photo 又已经创建好了,我想给 photo 加上 topic_id,又需要这个 topic_id 才能找到 photo, 这不是个悖论吗?(当然如果是 edit topic(topics/22/edit),然后上传图片,这样是没问题)

其实我是在用 rails_kindeditor 这个 gem,它里面要求的一个 owner_id 就是事先被创建的而且不能是空的,所以就遇到这个问题了

最后总结一下,转化为一个问题就是 怎么能把 topic 和 上传的图片 关联起来?

也可能文章根本没有和图片关联,具体可以看一下源码😁

设计的时候没做关联,做不到

找到了一个解决办法: https://stackoverflow.com/questions/20591031/accessing-one-controller-variable-in-another-controller-in-rails

在图片上传之后把图片 id 记录到 session 里面,然后等 topic 创建之后根据这个 session[:id] 去修改图片的 topic_id

photo 记 topic_id 不好记,可以考虑把 photo_ids 记在 topic 里~

如果是 ajax 上传,成功后返回 photo_id,插入 DOM(form) 里面,后面该怎么做就怎么做。

不过,相比 topic.photo_ids,我更偏向 photo.topic_id,photo 做成多态,比如 attachment, topic 就是 attachable。

如果觉得麻烦直接 new topic 就 create topic 问题也不大吧,更新时看标志,无效再删掉就行。

perky123 回复

photo_ids 记在 topic 里也是一样的啊,create topic 之后 topic 还是没和 photo 关联起来,也就没办法得到 photo_ids 了

其实问题关键不在于 topic.photo_ids 还是 photo.topic_id,我之前是没法拿到 photo_id,现在看来已经解决了~

7 楼 已删除
gihnius 回复

嗯,我也想过,但是直接 new topic 就 create 感觉 不太优雅吧..如果用户最后没有 create 那我还要删除,也比较麻烦

https://ruby-china.org/topics/12973#reply-136697

@macrow 感觉这个地方是否可以再优化一下呢,不然在执行 new action 的时候指定的 owner_id 都无效了~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号