从Azure中排序和筛选返回的数据

时间:2012-12-13 16:49:31

标签: ruby ruby-on-rails-3 azure-storage

我是RoR的新手,并尝试设置一个应用程序,列出Windows Azure帐户上的所有容器/文件。使用waz-storage gem,我能够在其中找到容器和blob,但我遇到的问题是尝试通过其中一个元数据属性来订购返回的容器列表,并根据它们进行过滤在用户电子邮件上。

使用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=>"user@example.com", :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属性过滤列表。几乎所有用户都会一直显示整个列表,但会有一些用户只能访问在元数据中包含电子邮件的容器。

我做了一些搜索,似乎找不到任何有用的东西。我有点死路一条。

我想知道的另一件事是,我应该在View中完成所有这些工作吗?或者将此逻辑移至模型或控制器?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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}

作为一般经验法则,您应该尝试将逻辑排除在视图之外。您还希望尽可能保持控制器的瘦。如果我这样做,我会创建一个我可以从我的控制器调用的服务类。