如何根据列表内容在列表前打印标题?

时间:2016-01-05 09:34:01

标签: ruby-on-rails ruby

假设我有一个数组块,对于每个值,我打印或不打印基于某些标准的内容。

<% @friends.each do |friend| %>
  <% if friend.status.best = true %>
    <%= friend.name %>
  <% end %>
<% end %>

如果打印了至少一个值,我想要一个标题,如下所示:

BEST FRIENDS
  friend1
  friend2
  etc

但如果最终没有打印出任何值,我根本不需要任何标题。

这是我试过的:

如果我在块条件中设置了一些变量@v

  <% if friend.status.best = true %>
    <%= friend.name %>
    <% @v = true %>
  <% end %>

然后我可以使用if @v条件来打印标题,但问题是标题应该在块之前打印。

我想到使用if @v条件来用javascript填充标题,但有时不是瞬间的,我希望标题立即就在那里。

有人有任何建议吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

browser.open("http://192.168.1.1/bbox-maintenance.lp")    
browser.select_form(nr = 0)
browser.form.find_control("main_reboot").readonly = False
browser.form['main_reboot'] = "1"
browser.submit()

答案 1 :(得分:0)

您可以使用Enumerable#any?快速确定是否有最好的朋友。

IF OBJECT_ID(N'tempdb..#T', 'U') IS NOT NULL DROP TABLE #T;

CREATE TABLE #T
(
    [Date] DATE,
    Business VARCHAR(50),
    Value INT,
    Name VARCHAR(50)
);
INSERT #T (Date, Business, Value, Name)
VALUES
    ('20150601', 'EUR', 1, 'Group 1'), 
    ('20150605', 'EUR', 12, 'Group 2'), 
    ('20150605', 'EUR', 3, 'Group 3'), 
    ('20150701', 'EUR', 2, 'Group 1'), 
    ('20150708', 'EUR', 2, 'Group 2'), 
    ('20150702', 'EUR', 7, 'Group 3'), 
    ('20150703', 'AAA', 2, 'Group 1');


DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
DECLARE @start AS DATETIME
DECLARE @end AS DATETIME
DECLARE @business AS VARCHAR(50)

SET @start = '2015-01-01';
SET @end   = '2015-12-01';
SET @business = 'EUR';

--Get distinct values of the PIVOT Column 
SET @ColumnName = 
        STUFF(( SELECT  ',' + QUOTENAME(CONVERT(VARCHAR(10), D.[Date], 120))
                FROM (  SELECT  [Date] = DATEADD(MONTH, DATEDIFF(MONTH, 0, [Date]), 0)
                        FROM    #T
                        WHERE   [Date] BETWEEN @start AND @end
                        GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, [Date]), 0)
                    ) AS d
                ORDER BY d.[Date]
                FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');


 SET @DynamicPivotQuery = 
    'SELECT Name, ' +  @ColumnName + '
    FROM    (   SELECT  SUM(bb.value) AS Value, 
                        Date = DATEADD(MONTH, DATEDIFF(MONTH, 0, bb.date), 0), 
                        ISNULL(bb.name, ''Total'') AS Name 
                FROM    #T AS bb 
                WHERE   bb.date BETWEEN @StartParam AND @EndParam
                AND     bb.Business = @BusinessParam
                GROUP BY GROUPING SETS ((bb.date, bb.name), (bb.Date))
            ) AS t
            PIVOT
            (   SUM(t.value) 
                FOR date IN (' + @ColumnName + ')
            ) AS PVTTable;';

EXECUTE sp_executesql 
    @DynamicPivotQuery, 
    N'@StartParam DATETIME, @EndParam DATETIME, @BusinessParam VARCHAR(50)',
    @StartParam = @Start,
    @EndParam = @End,
    @BusinessParam = @Business;

另请注意,您的代码中存在错误。您将值true分配给最佳属性:

<% if @friends.any? { |friend| friend.status.best } %>
  # The header
<% end %>

这将导致循环始终返回true并打印出名称。您要做的是将<% if friend.status.best = true %> <%= friend.name %> <% end %> 替换为=

==

或只是

<% if friend.status.best == true %>
  <%= friend.name %>
<% end %>

回到最初的问题,如果项目数量很大,<% if friend.status.best %> <%= friend.name %> <% end %> 的方法有点效率低,因为你需要将集合循环两次。此外,当你真正想要的东西(至少从你发布的片段中)显示最好的朋友时,你正在迭代整个#any?集合。

您可能希望更改查询,以便@friends仅包含最好的朋友(@friendsbest的那些记录)。通过这种方式,您可以简单地检查集合中是否存在值。