产品不是同学录,但很像。Model 设计上有些问题,不知道有没有大拿可以指点一下。
基本上就是要求每个班级都有自己的二级域名,或绑定一级域名,用户直接到班级注册,注册完就是班级一员,审核后开通相应权限。
简单的想法是有个 class 表,每个注册的同学在 user 表,当然多个 class_id 字段,belongs_to 的关系。
另外,如果要建一个留言板,势必也要多一个 class_id 字段,每班的同学只能看到自己班的留言。
我的问题是,这样 class_id 会无处不在,相当麻烦,还会把本来很简单的关系搞得相当复杂。
有没有更好的解决办法呢?谢谢
我认为你描述的 class_id 的用法是正确的,我看不出 users 表和 topics 表都包含 class_id 字段有什么问题。 可能唯一的问题是表名和方法名,最好是把 class_id 替换成另外一个更好的名字,class_id 貌似不是系统保留方法名吧?
你的业务模型里都是带一个像 class_id 这样的元素,所以你的你模型里肯定 也是带有这个的
起码在传统的关系型数据库里没有办法避免
除非用非关系型的
班级可能做为一个命名空间一样的东西,这样就会很干净了
#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
不知道是不是能够满足你的需求