2011-03-18 94 views
0

我想弄清楚如何建模设备/服务关系。 我正在使用Rails 3和MongoDB/Mongoid。 Rails应用程序用于监视IP网络。Rails模型之间的关系

  • 网络上的设备(工作站,服务器等)使用Device模型表示。
  • 服务是一种服务,例如HTTP,SMTP,SSH,并且每种服务“类型”(HTTP,SMTP,SSH)都可以与许多设备关联。
  • 每个服务“类型”可能有一些选项,可以设置与 关联的特定设备(如果HTTP服务不是 运行在端口80上,例如,HTTP可能有端口选项)。

在用户手动添加设备的视图中,我需要某种方式让他们选择 他们希望应用程序监视的服务。

此外,如果用户尝试运行自动设备发现,我希望通过应用程序支持的服务并查询设备以查看设备是否支持该服务。

最后,作业以特定间隔运行,以便从数据库中的每个设备提取新数据。 在该轮询工作中,我需要一些方法来查询与设备关联的每个服务,然后保存特定于设备/服务关系的数据(服务升/降等)。这是我卡住的地方。我不知道该怎么做。 我需要第三个模型吗?如何在我的模型中指定这些数据? 或者我可能会说这一切都是错误的,并且有更好的方式来表示我想要做的 ?

这是我的模型代码看起来像现在:

device.rb

class Device 
    include Mongoid::Document 

    field :name 
    field :ip_address 

    references_many :services 

    def polll 
     # psuedocode 

     for each service 
      query service 
     end 

     # save data back to DB 
     update_attributes(...) 
    end 
end 

service.rb

class Service 
    include Mongoid::Document 

    field :name 
    field :description 

    references_many :devices 
end 

回答

0

在关系数据库中,你会是什么实际上需要的是一个has_many到 call w指定一个连接模型。

class Device 
    has_many :ports 
    has_many :services, :through => :ports 
end 

在这里你可以做同样的服务模型,并添加一个端口模型作为连接模型。但是,既然你使用的是Mongo,我会建议你将Service嵌入到Device中。这使得查询变得容易得多,并且在没有设备存在的情况下服务真的不应该被管理。不要担心数据重复,因为您拥有的是数据模型的更自然的表示。

下面是Mongoid的语法协会,包括嵌入式的人一个文档页面,http://mongoid.org/docs/associations/

+0

确定。因此,如果我说Device“embeds_many:services”,我该如何指定我的应用支持哪些类型的服务(HTTP,SMTP,SSH等),以便我的自动发现或新设备视图可以查找支持的服务? – 2011-03-18 18:29:14

+0

好吧,这将是您用来为您的应用程序播种的后台作业的责任。它应该意识到,每个添加/更新的设备都已将捆绑的服务与相应的种子文档集合结合起来。 – 2011-03-21 14:49:00

+0

顺便说一句,对不起,我花了很长时间来回答。 – 2011-03-21 14:49:42