希望为许多组织提供访问权限

时间:2015-10-07 07:04:47

标签: ruby-on-rails

我们正在为学校开发一个在线导轨应用程序,但我们希望将所有学校相互分开。 与slack网站一样,管理来自一个应用程序和组织的许多组织只能访问该数据。 与trello一样,它们也在一个应用程序中分离组织。

那么最好的方法是用于这种类型的应用程序?

我们如何在我们的ruby on rails应用程序中实现这一点,我们将数据库中的所有学校分开?

2 个答案:

答案 0 :(得分:1)

好。

多租户

如果您来自“原生”软件世界,那么您最好阅读multi tenancy

http://www.theenterprisearchitect.eu/blog/wp-content/uploads/2010/04/100427_multi-tenancy_and_mde_necessary_assests_of_a_paas.png

Rails应用程序是多租户,因为它们通过网络运行;他们运行一个应用程序的单个实例,然后该网络上的任何人都可以访问该应用程序(请记住,互联网是一个庞大的网络)。

Rails提供了上面提到的所有功能,还有很多世界领先的公司使用它来运行(Twitter,AirBnb,Groupon等都使用Rails)。

您需要了解应用程序的数据库系统设计,特别是......

<强> MVC

为了更好地理解你如何创建一个像你所引用的应用程序,你需要理解MVC (Model View Controller) programming pattern,它在object-orientated系统设计的世界中是有价值的,特别是与Rails相关的:

enter image description here

与许多其他框架一样,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

希望它对您的初始设计有所帮助。