Rails - 合并2个对象并检查结果是否为NULL

时间:2014-12-08 15:40:26

标签: ruby-on-rails ruby arrays rails-activerecord

我正在添加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]

为什么?

提前感谢你们的时间。

3 个答案:

答案 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,则结果为空数组。