【问题标题】:Relationships between Rails modelsRails 模型之间的关系
【发布时间】:2011-03-18 15:40:21
【问题描述】:

我试图弄清楚如何为设备/服务关系建模。 我正在使用 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

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    在关系数据库中,您实际需要的是一个 has_many through 调用并指定了连接模型。

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

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

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

    【讨论】:

    • 好的。因此,如果我说 Device "embeds_many :services" 我如何指定我的应用程序支持的服务类型(HTTP、SMTP、SSH 等),以便我的自动发现或新设备视图可以查找支持的服务?
    • 嗯,这将是您用来播种应用程序的后台作业的责任。它应该意识到每个添加/更新的设备都捆绑了服务,并相应地为您的文档集合播种。
    • 顺便说一句,对不起,我花了这么长时间才回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多