2011-03-18 120 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