我们正在为学校开发一个在线导轨应用程序,但我们希望将所有学校相互分开。 与slack网站一样,管理来自一个应用程序和组织的许多组织只能访问该数据。 与trello一样,它们也在一个应用程序中分离组织。
那么最好的方法是用于这种类型的应用程序?
我们如何在我们的ruby on rails应用程序中实现这一点,我们将数据库中的所有学校分开?
答案 0 :(得分:1)
好。
多租户
如果您来自“原生”软件世界,那么您最好阅读multi tenancy:
Rails应用程序是多租户,因为它们通过网络运行;他们运行一个应用程序的单个实例,然后该网络上的任何人都可以访问该应用程序(请记住,互联网是一个庞大的网络)。
Rails提供了上面提到的所有功能,还有很多世界领先的公司使用它来运行(Twitter,AirBnb,Groupon等都使用Rails)。
您需要了解应用程序的数据库系统设计,特别是......
<强> MVC 强>
为了更好地理解你如何创建一个像你所引用的应用程序,你需要理解MVC (Model View Controller) programming pattern,它在object-orientated系统设计的世界中是有价值的,特别是与Rails相关的:
与许多其他框架一样,Rails使用MVC来构建对象。这些对象由程序员定义,但基本上允许您创建为您提到的应用程序提供功能所需的相关数据。
具体来说,每次访问一个Rails应用程序 - 你将基本上操纵填充了db数据的对象。如果需要,我会在更新中解释任何细节。
关于您的问题,将多个组织/实体集成到单个应用程序中的方法是设置数据库模式以将organization
作为“父”进行管理,并将用户和数据作为额外元素: / p>
#app/models/company.rb
class Company < ActiveRecord::Base
has_many :users
has_many :invoices
has_many :clients, through: :invoices
end
#app/models/user.rb
class User < ActiveRecord::Base
belongs_to :company
has_many :invoices
end
#app/models/invoice.rb
class Invoice < ActiveRecord::Base
belongs_to :company
belongs_to :user
has_many :clients
end
这将使您能够使用以下内容:
#config/routes.rb
constraints Account do
root "invoices#index" #-> http://company.url.com
resources :invoices #-> http://company.url.com/invoices/3
end
#lib/account.rb
class Account
def matches?(request)
Company.exists?(request.subdomain)
end
end
然后,您就可以使用Devise
在组织中签名,允许用户根据需要添加/修改invoices
。
每次编辑或更新发票时,都会为其分配user
,以便您确定是谁创建的。
如果不深入研究代码,那就是我认为您需要了解的内容。
答案 1 :(得分:0)
关注数据库设计,您可以设计类似:
您应该管理一个组织模型,其中每个组织必须是一个子域,而您的其他模型如User等应该与组织模型相关联。您可以从请求URL中提取子域名(如request.host,request .subdomain等..)并根据此子域请求查找记录。
作为资源许可的关注,您可以使用cancan gem,您可以通过单个文件管理资源可访问性。
https://github.com/CanCanCommunity/cancancan
希望它对您的初始设计有所帮助。