2014-12-08 1 views
0

내가 2 개체를 추가하고 변수로 저장하고 NULL인지 여부를 확인 :레일 -이 같은 일이 객체를 병합하고 그 결과가

@articles = Articles.where(...condition1...) + Articles.where(...condition2...) 
나는이 두 개체를이 방법을 병합해야

는, 불행히도있다 두 가지 쿼리를 대체 할 쿼리를 작성할 필요가 없습니다.

어쨌든 첫 번째 쿼리에 데이터가 포함되어 있거나 두 번째 쿼리에서 일부 데이터가 반환되거나 둘 다 일부 데이터가 반환되면 데이터를 반복하여 처리 할 수 ​​있습니다.

하지만 그 두 쿼리 중에 데이터를 반환하지 않는 경우,이하여 @articles 변수의 출력 :

<% if @articles.count > 0 %> # this returns 2 
    <% @articles.each do |article| %> 
    <div><%= article.id %></div> # error - undefined `id` for nil 

이유 : 나는 같은 것을 할 경우,보기에 따라서

puts @articles.inspect # => [nil, nil] 

위 쿼리 중 하나라도 데이터를 반환하지 않으면 결과는 대신 [nil, nil]입니까?

@articles이 두 개의 쿼리를 결합 할 수 있지만 적어도 쿼리에서 결과가 반환되는 경우 출력은 [data]이 아니고 [data, data]이 아닙니다.

왜 그럴까요?

시간을내어 미리 감사드립니다.

+1

어느 내가 눈치 적이 뭔가 또는 explictily'사용하는 것처럼 그것은 where' 문'where' 반환'액티브 :: Relation' 인 때문에 보이지 않습니다 [to_a] (http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-to_a)에 의해 '배열'로 '변형'되었습니다. 이러한 쿼리 스텁이 포함 된 코드 스 니펫을 추가하십시오. – blelump

+0

@ble 럼이 정확합니다. 여기서 무엇이 일어나고 있습니까? '# where'는'ActiveRecord :: Relation' 객체를 반환합니다. '+'를 사용하여 결합하면 'Array'가 반환됩니다. 'Articles.where (이름 : "존재하지 않음") + Articles.where (이름 : "또한 존재하지 않습니다")''[] '를 반환해야하기 때문에 데이터를 변경해야한다고 생각합니다 – engineersmnky

답변

0
<℅unless article.nil?℅> 
    <div><%= article.id %></div> 
<℅else℅> 
    <div>no content. </div> 
<℅end℅> 

오류는 nil 클래스에 메소드 또는 속성 ID에 대한 정의가 없음을 나타냅니다. 위의 스 니펫을 사용하십시오.

+0

예, 이것은 그러나 빠른 픽스는 왜 그런지 설명하지 않습니다. – user984621

+0

+ 연산자는 두 개의 배열을 추가하기위한 것입니다. 여기에 쿼리 결과를 추가하는 것입니다.(이 경우에는 Nil). 이것은 나의 가장 좋은 설명이 될 것이다. – Ritikesh

+0

이것을 정당화하려면 [nil] + [nil] = [nil, nil] – Ritikesh

0

당신은 두 개의 배열을 연결할 수 있습니다 : 두 배열이 nil 될 경우

@articles = [*Articles.where(...condition1...).to_a] + [*Articles.where(...condition2...).to_a] 

는, 결과는 하늘의 배열 될 것입니다.

+0

@engineersmnky -'nil.to_a'는'[nil]'이 아니라'[]'입니다. 그래서 [[*]] + [* []] # => []' –

1

배열을 다시 반복 할 필요가 없다면 "축소"를 수행하십시오.

@articles.compact! 

@articles를 할당 한 행 이후.

@articles가 배열이된다고 가정합니다.

그렇지 않은 경우 :

@articles = @articles.to_a.compact 
관련 문제