Rails模型之间的关系

时间:2011-03-18 15:40:22

标签: ruby-on-rails mongodb mongoid

我正在试图弄清楚如何建立设备/服务关系。 我正在使用Rails 3和MongoDB / Mongoid。 Rails应用程序用于监控IP网络。

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

在用户手动添加设备的视图中,我需要一些允许他们选择的方法 他们希望应用程序监控的服务。

此外,如果用户尝试运行自动设备发现,我想浏览该应用支持的服务并查询设备以查看该设备是否支持该服务。

最后,作业以一定的间隔运行,以从数据库中的每个设备提取新数据。 在该轮询作业中,我需要一些方法来查询与设备关联的每个服务,然后保存特定于设备/服务关系的数据(服务上/下等)。这就是我被困住的地方。我不知道该怎么做。 我需要第三个型号吗?如何在模型中指定此数据? 或者也许我认为这一切都错了,有一种更好的表达方式 我想做什么?

这就是我的模型代码现在的样子:

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

1 个答案:

答案 0 :(得分:0)

在关系数据库中,您实际需要的是使用指定的连接模型进行 has_many到调用。

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

在这里,您将对服务模型执行相同操作,并添加端口模型作为连接模型。但是,由于您使用的是Mongo,我建议您将Service嵌入到Device中。这使得查询变得更加容易,并且如果没有设备存在,就不应该管理服务。不要担心数据重复,因为您拥有的是更自然的数据模型表示。

这是Mongoid关联语法的文档页面,包括嵌入式语法,http://mongoid.org/docs/associations/