我正在添加2个对象并将它们保存到变量中,如下所示:
@articles = Articles.where(...condition1...) + Articles.where(...condition2...)
我需要以这种方式合并这两个对象,遗憾的是没有办法编写一个可以替换2个查询的查询。
无论如何,问题是什么 - 如果第一个查询包含数据,或者第二个查询返回一些数据,或者两者都返回一些数据,那么我可以迭代数据并使用它们。
但如果这两个查询都没有返回数据,那么这就是@articles
变量的输出:
puts @articles.inspect # => [nil, nil]
所以在视图中,如果我做这样的事情:
<% if @articles.count > 0 %> # this returns 2
<% @articles.each do |article| %>
<div><%= article.id %></div> # error - undefined `id` for nil
为什么上述任何查询都没有返回数据,结果是[nil, nil]
而不是nil
?
解释可能是@articles
是两个查询的组合,但如果至少在查询中返回某些内容,则输出只是[data]
,而不是[data, data]
。
为什么?
提前感谢你们的时间。
答案 0 :(得分:1)
<℅unless article.nil?℅>
<div><%= article.id %></div>
<℅else℅>
<div>no content. </div>
<℅end℅>
该错误表明nil类没有方法或属性id的定义。使用上面的代码段。
答案 1 :(得分:1)
如果您不关心对阵列进行重新迭代,请执行紧凑!&#34;
@articles.compact!
在您指定@articles的行之后。
假设@articles将是一个数组。
如果不是:
@articles = @articles.to_a.compact
答案 2 :(得分:0)
您可以连接两个数组:
@articles = [*Articles.where(...condition1...).to_a] + [*Articles.where(...condition2...).to_a]
如果两个数组为nil
,则结果为空数组。