开发者

Relationships between Rails models

I'm trying to figure out how to model a Device/Service relationship. I'm using Rails 3 and MongoDB/Mongoid. The Rails app is for monitoring IP networks.

  • A device on the network (workstation, server, etc.) is represented using a Device model.
  • A service is a service such as HTTP, SMTP, SSH and each service "type" (HTTP, SMTP, SSH) can be associated with many devices.
  • Each service "type" may have some options that can be set when associated with a specific device (I'm thinking HTTP could have a port option if the HTTP service isn't running on port 80 for example).

In the view when a user manually adds a device I need some way of allowing them to pick the services they want the app to monitor.

Further, if the user tries to run an automatic device discovery I would like to go through the services the app supports and query the device to see if the device supports that service.

Lastly, a job runs at a certain interval to pull in new data from each device in the DB. In that polling job I need some way of querying each service associated with the device and then saving the data (service up/down, etc.) that is specific to the device/service relationship. This is where I'm stuck. I don't know how to do this. Do I need a third model? How do I specify this data in my model? Or perhaps I'm going about this all wrong and there is a better way of representing what I want to do?

This is what my model code looks like now:

device.rb

class Device
    include Mongoid::Document

    field :name
    field :ip_address

    references_many :services

    def polll
        # psuedocode

        for 开发者_如何学Ceach 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


In a relational database, what you would actually need is a has_many through call with a join model specified.

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

Here you would do the same for the Service model and add a Port model as the join one. However, since you're using Mongo, I'm gonna suggest that you embed Service into Device. This makes querying much much easier and a Service really shouldn't be managed without a Device present. Don't worry about data duplication, because what you'll have is a more natural representation of your data model.

Here's a doc page for Mongoid's syntax for associations, including the embedded ones, http://mongoid.org/docs/associations/

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜