我正在尝试理解由不在场的人编写的一行代码:
- if acct.activity[year] && acct.activity[year][month]
它用于以下环境:
%tbody
- x = (@today.year == year) ? @today.month : 12
- x.downto(1) do |month|
%tr
- if month == x
%td{rowspan: x}= year
%td= Date::MONTHNAMES[month]
- @customer.accounts.each do |acct|
- if acct.activity[year] && acct.activity[year][month]
%td{'data-transactions' => acct.activity[year][month]}
- stmt = acct.statement(year, month)
= link_to 'View', url(:statements, :show, id: stmt.to_s)
= link_to image_tag('/icons/document-pdf.png', alt: 'Download PDF'), url(:statements, :show, id: stmt, format: :pdf), class: :pdf
- else
%td
此代码的目的是按月和年显示财务报表。奇怪的是我可以在我的控制台中输出数据并采用这种形式;
{10=>1}
1
{3=>2}
2
{6=>1}
1
{6=>1, 9=>1}
1
{7=>2}
2
{3=>1}
1
{2=>1}
1
{2=>1, 4=>1}
1
{2=>1, 4=>1, 8=>2}
2
{4=>1}
1
{4=>1, 5=>1}
1
{4=>1, 5=>1, 6=>1}
1
{4=>1, 5=>1, 6=>1, 7=>14}
14
它存在但由于某种原因它没有被退回。我们在使用db调用存储过程时工作了,但是我们正在改变项目以使用API和HTTP调用,从那时起它就不起作用了。这是声明它和puts在控制台中生成上述内容的地方:
@activity = {}
@activity = response['AccountActivity'].map do |row|
@activity[row['year']] = {} unless @activity[row['year']]
@activity[row['year']][row['month']] = row['transactions']
puts @activity[row['year']]
puts @activity[row['year']][row['month']]
end
答案 0 :(得分:1)
看起来acct.activity
会返回哈希值。如果您刚刚执行了acct.activity[year][month]
,并且acct.activity[year]
为零,则您将执行nil[month]
,这会导致错误。
&&
为logical and
因此,如果acct.activity[year]
为零,则整个测试将返回nil,而不是错误。因此,当您不确定散列中的内容时,它是一种简单的安全机制。
答案 1 :(得分:0)
鉴于acct.activity()
返回嵌套的'哈希',它通常用于检查返回的hash
是否包含预期的条目。
a = { :a => {}, :b => { :c => 2 } }
a[:a] && a[:a][:x] ? true : false
# => false
a[:b] && a[:b][:c] ? true : false
# => true