我说一下大概的设计原型
User 为用户
Topic 为文章
Reply 为留言
关系分别为:
User has many Topics
User has many Replies
Topic has many Replies
用户想查看当前自己发的文章,可以通过以下查询:
User.Topics //最近发布的帖子
查看自己的所有留言可以通过一下查询:
User.Replies //最近回复的帖子
查看自己的某个文章下的所有留言,可以通过以下查询:
User.Topics.Replies //Home/提醒
但是我看 RubyChina,上提醒是专门用 notifications 处理的,而此站点使用 MongoDB 看不太懂,所以我想问一下这个数据库的设计。 例如 notifications 和以上的关系,而且还如何判断是否为未读贴。notifications 有什么 column?
这个回复提醒功能自己第一次接触,如果有什么参考数据库设计的,可否发个教程呢?谢谢
哥儿们,没有哪位仁兄给个回复呢? 给个相关参考链接也好嘛。 我在百度怎么搜索都搜索不到,可能关键词不对。不过不知道什么样的关键词才好。 google 英语不知道怎么表达。。。
#3 楼 @QueXuQ https://github.com/ruby-china/ruby-china/blob/master/db/schema.rb 表的设计就在这里。mongoid 不用 migration,直接在 models 建字段和表什么的,ruby-china 的 notifications 我很早以前就看过了,水平太低没看明白怎么回事。
#5 楼 @QueXuQ 简单的说 mongoid 没有 migration 呀。
mongoid 里表示 mongodb 的表就是 model 的文件名,字段就是
class Notification::Base
include Mongoid::Document
include Mongoid::Timestamps::Created
include Mongoid::BaseModel
field :read, :default => false # field就是字段,应该是boolean类型的字段,不知道为什么没有声明:type => Boolean
belongs_to :user # 这是表的关系
index :read => 1
index :user_id => 1, :read => 1
end
mongoid 的文档很不错,不需要太好的英文,慢慢看就懂了。http://mongoid.org/en/mongoid/index.html
Mongoid 里面,belongs_to :user
会在保存时候自动加上 :user_id 字段
notification 的字段大概是这样
{
_id: xxx,
user_id: xxx,
read: false,
_type: xxx, // 'Mention' / 'TopicReply'
mentionable_id: xxx, // 'Memtion' 消息有这个
reply_id: xxx // 'TopicReply' 消息有这个
}
如果是用 MySQL,推荐最后两个字段合并成一个 target_id
。
Mongoid 的字段定义都在 Model 里面,_id 是自带的,belongs_to 会自动加上 xxx_id,继承会加上 _type,然后就是 field 了。
#10 楼 @Rei 大哥,根据你的解释,相对都比较清晰了,但是有几个问题搞不懂,不知道可否帮我解决一下呢? mentionable 究竟是做什么用处的?(本来只以为一个 notification 起作用,没想到有蹦出个 mentionable) 还有就是,根据功能实现来说,每当我回复文章的时候,该文章的作者应当收到一个提示“未读信息”,这样说,应该是当我 create reply 的时候,应该运行相关方法,例如创建 reply.notification,之类的运作,可是我看源代码,没有执行什么特别的功能,就是一个数据的存储而已,代码如下:
def create
@reply = @topic.replies.build(params[:reply])
@reply.user_id = current_user.id
if @reply.save
current_user.read_topic(@topic)
@msg = t("topics.reply_success")
else
@msg = @reply.errors.full_messages.join("<br />")
end
end
这一点我就摸不着头绪了,是哪里创建了 notification?
#13 楼 @Rei 有 AT 这个功能才需要在 TOPICE 增加 mention 提醒吧。 我现在想一步一步来,不好意思,资质比较差,真心搞不懂 mentionable 是做什么用的?
我写一下我的思路,麻烦你指正一下错误。
我有多少条未读信息,也就是count notification有多少个false。
一般notification只产生在留言回复上,所以在reply上创建一个callback,每当创建了一个reply,只要不是current_user自己,就生成一个notification,并且将reply_id,user_id对应到当前留言用户和留言信息上。
然后每次查看topic的时候都注意,如果notification为false时候,就把该notification的值设置为true。
然后如果是按照我想象的那样,那 mentionable 究竟是起什么作用的,如果无限制的这样生成 notification,那不就会生成非常多的 notification 了?
这个功能弄了我好久,关键看 rubychina 源代码,太庞大了,摸不着头脑,网上找不到相关思路。