Rails 想做同学录,求思路

Peter · 2015年07月14日 · 最后由 peter 回复于 2015年07月15日 · 2016 次阅读

产品不是同学录,但很像。Model 设计上有些问题,不知道有没有大拿可以指点一下。

基本上就是要求每个班级都有自己的二级域名,或绑定一级域名,用户直接到班级注册,注册完就是班级一员,审核后开通相应权限。

简单的想法是有个 class 表,每个注册的同学在 user 表,当然多个 class_id 字段,belongs_to 的关系。

另外,如果要建一个留言板,势必也要多一个 class_id 字段,每班的同学只能看到自己班的留言。

我的问题是,这样 class_id 会无处不在,相当麻烦,还会把本来很简单的关系搞得相当复杂。

有没有更好的解决办法呢?谢谢

我认为你描述的 class_id 的用法是正确的,我看不出 users 表和 topics 表都包含 class_id 字段有什么问题。 可能唯一的问题是表名和方法名,最好是把 class_id 替换成另外一个更好的名字,class_id 貌似不是系统保留方法名吧?

#1 楼 @lgn21st 谢谢回答,class_id 我也只是在这举例子,实际上的分组不会是班级。

如果都包含 class_id,那在一些复杂的多对多关系中,就会更麻烦。比如一个老师教多个班,也可以参与每班的讨论,那老师跟班级是多对多,老师在每个班的留言板发言就要带上不同的 class_id,而不像同学那样,与班级是一对一的关系。

你的业务模型里都是带一个像 class_id 这样的元素,所以你的你模型里肯定 也是带有这个的

起码在传统的关系型数据库里没有办法避免

除非用非关系型的

班级可能做为一个命名空间一样的东西,这样就会很干净了

做着玩?

印象中,10 年前有个产品跟这个类似,好像叫做“ChinaRen”,后来这个项目死掉了。

#5 楼 @pengedy 你还太年轻了,最早的是 5460.net,5460 的意思是“我思念你”

#4 楼 @lips 不是做着玩,想把现在某单一的系统做成托管的。就像 http://logdown.com/ 那种托管平台。不同的是,logdown 只是单用户建单 blog,我想做成多用户维护同一个 blog, blog 之间还要彼此隔离。

当然多个 class_id 字段

这个是甚么意思?没看明白。

我的设想是:

# Model
class User < ActiveRecord::Base
  has_and_belongs_to_many :classes, class_name: "Klass"
  has_many :messages
end

class Klass < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_one :messages_board

  #Attributes:
  #  binded_sub_domain => 绑定的二级域名
  #  checked_at => 审核通过的时间
  # ... => 其他字段
end

class MessagesBoard < ActiveRecord::Base
  belongs_to :class, class_name: "Klass"
  has_many :messages, dependent: :destroy
end

class Message < ActiveRecord::Base
  belongs_to :message_board
  belongs_to :user
end

# Controller
class ApplicationController < xxxx
  def retrieve_current_class_by_sub_domain
    @class ||= Klass.find_by binded_sub_domain: request.subdomain # 这一行代码是示例,不保证可执行
  end
end

# 权限控制,以 cancancan 为例
class Ability
  include CanCan::Ability

  def initialize(user)
    can [:create, :read], Message, message_board: {class: user.classes}  # 用户可以创建跟浏览自己班级下的留言板上的信息
    # ... something else
  end
end

不知道是不是能够满足你的需求

#6 楼 @peter 太年轻 orz (:з」∠)

#8 楼 @martin91 当然多个 class_id 字段 意思就是在 userclassbelongs_tohas_many 的关系,如果像你这样设计,user 表 包含老师就会变成 has_and_belongs_to_many 的关系。

你的设计已经足够好,我试一下,谢谢~

#10 楼 @peter 如果需要区分学生跟老师,可以考虑用单表继承,但是用单表继承的前提是表的字段一致,如果不能满足前提,就建议用独立的两张表,这个看具体业务。

#7 楼 @peter 你做好了,找什么同学来用呢,呵呵

#12 楼 @lips 亲,请看帖子第一句:产品不是同学录,但很像。

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