2012-12-13 11 views
0

我是一個新的RoR,試圖設置一個應用程序,列出Windows Azure帳戶上的所有容器/文件。使用waz-storage gem,我能夠找到它們中的容器和blob,但是我遇到的問題是嘗試通過其元數據屬性之一對容器返回的列表進行排序,並根據用戶電子郵件對其進行過濾。從Azure中排序和篩選返回的數據

使用container.list我得到每個容器的名單如下:

[#<WAZ::Blobs::Container:0x60295f8 @name="12345">, #<WAZ::Blobs::Container:0x60295b0 @name="23456">, #<WAZ::Blobs::Container:0x6029580 @name="34567">] 

每個容器都有自己的元數據,我可以通過調用@container.metadata得到:

{:transfer_encoding=>"chunked", :last_modified=>"Thu, 13 Dec 2012 06:01:23 GMT", :etag=>"\"0x8CFA70E6A590AD9\"", :server=>"Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", :x_ms_request_id=>"a2cbc9ba-9e59-4c27-8a50-c54b405cbb1b", :x_ms_version=>"2011-08-18", :x_ms_meta_customername=>"Sample Name", :x_ms_meta_useremail=>"[email protected]", :date=>"Thu, 13 Dec 2012 16:29:16 GMT"} 

在視圖我想列出每個容器和使用:x_ms_meta_customername屬性的鏈接。我已經得到了該點在視圖中使用:

<% @containerlist.each do |container| %> 
    <li><%= link_to container.metadata[:x_ms_meta_customername], root_url(:container => container.name) %></li> 
<% end %> 

視圖中的鏈接創建在container.name值從上面的列表是「12345」的順序,「23456」和「34567」。相反,我希望按照:x_ms_meta_customername的順序排列列表。

我已經嘗試了幾個不同的事情來獲取列表進行排序,但最終要麼沒有對它進行排序,要麼得到有關將字符串轉換爲整數的錯誤。我可能會把這一切都說錯了。

我想要做的另一件事是根據:x_ms_meta_useremail屬性篩選列表。幾乎所有用戶都會一直顯示整個列表,但是會有一些用戶只能訪問元數據中具有電子郵件的容器。

我已經做了一些搜索,似乎無法找到任何有用的東西。我有點碰上死衚衕。

我想知道的另一件事是,我應該在視圖中完成所有這些工作嗎?或者將這個邏輯移動到模型或控制器?

任何幫助將不勝感激!

回答

1

您可以使用sort對記錄進行排序。

@containerlist.sort {|a, b| a.metadata[:x_ms_meta_useremail] <=> b.metadata[:x_ms_meta_useremail]} 

或者更簡單:

@containerlist.sort_by {|c| c.metadata[:x_ms_meta_useremail]} 

要篩選,您可以使用reject!

@containerlist.reject! {|c| c.metadata[:x_ms_meta_useremail] != @user.email} 

作爲一般的經驗法則,您應該嘗試將邏輯放在視圖之外。你也想保持你的控制器儘可能瘦。如果我這樣做,我會創建一個服務類,我可以從我的控制器調用。

+1

啊!我很接近。非常感謝答覆,我正在尋找。現在我將着手使用這種方法,並研究創建服務類。再次感謝! –