2009-12-30 3 views
0

부분 렌더러 내에서 일부 상태를 어떻게 기억할 수 있습니까?부분 렌더러에서 RoR 기억

문제점 : 내 부분 _testitem.html.erb은 testitem 컬렉션의 테이블 행을 렌더링합니다. Testitemidsortkey을 가지며,이 부분

<%= render :partial => "testitem", :collection => @testbox.testitems.sort_by{|x| [x.sortkey, x.id]} %> 

즉 모든 testitems 그들의 ID에 의해 다음 sortkey으로 분류되고 불려. 지금은 현재 sortkey를 표시하는 테이블 열을 표시하고 싶습니다 내가 모든 <td> GET, 물론 테이블을 나누기

<td rowspan="<%= Testitem.count_by_sql "SELECT count(*) from testitems where sortkey=#{testitem.sortkey}" %>"><%=h testitem.sortkey %></td> 

를 사용하여 깔끔한 것 생각 ROWSPAN입니다. 예상되는 결과 (_testitem.html.erb 내에서) 나는 주어진 sortkey에 이미 <td rowspan="">을 추가 한 사실을 "기억"할 수있는 방법이 있나요 다소

Group | Id | Description | 
---------------------------------- 
    1 | 1 | ...   | 
     -------------------------- 
     | 2 | ...   | 
     -------------------------- 
     | 16 | ...   | 
---------------------------------- 
    2 | 3 | ...   | 
---------------------------------- 
    3 | 4 | ...   | 
     | 10 | ...   | 
     | 11 | ...   | 
--------------------------------- 

과 같을 것이다?

나를 도와 주셔서 감사합니다.

+1

메모 : 비즈니스 로직을 한 눈에 볼 수 있습니다. 보기에서 정렬 작업을해서는 안됩니다. 파인더 (': sort')에서 그렇게하는 것이 가장 이상적입니다. 그리고 당신은 확실히 당신의 관점에서 쿼리 ('count_by_sql')를하지 말아야합니다. –

+0

글쎄, 내 생각에 이것은 RoR에 새로운 모습을 보여준 것 뿐이다. 사실 뷰 외부의 정렬 요소가 있었으며 뷰에서 상처를 입지 않을 것이라고 생각했습니다. (뷰에만 의존하는 뷰이므로) 'count_by_sql'이 제 첫 번째 시도였습니다. 특정 sortkey에 속한 testitem의 수를 찾는 데는 어떨까요? – jhwist

+0

컨트롤러의 작업 (이 경우)은 데이터를 가져 와서보기에서 쉽게 사용할 수있는 양식으로 가져온 다음 인스턴스 변수에 할당하여보기에 제공하는 것입니다. – yfeldblum

답변

1

먼저 테스트 상자의 모든 testitem을 사용하는 경우 추가 카운트 쿼리가 필요하지 않습니다.

할 일은 그룹의 td로 첫 번째 항목 부분을 그리고 그 다음 나머지 항목을 규칙적으로 그립니다.컨트롤러의

: 당신의

@testitems_by_keys = @testbox.testitems.group_by(&:sortkey) 

보기 : _item에서

<% @testitems_by_keys.each do |group, items| %> 
    <%= render :partial => "item", :locals => { :object => items.shift, :group => group, :size => items.size+1 } %> 
    <%= render items %> 
<% end %> 

:

<tr> 
<% if local_assigns[:group].present? %> 
    <td rowspan="<%= size %>"><%= group %></td> 
<% end %> 
rest of the partial.... 
</tr> 

참고 : 그냥 .. 나 구문을 포함 할 수 없습니다 여기를 썼다 오류.

+0

@testitems_by_keys를 인스턴스 변수로 만드는 이유는 무엇입니까? 비즈니스 논리이므로 모델에서 더 이해할 수 있다고 생각합니다. 왜 items.size에 1을 더하는거야? – bobbywilson0

+0

회색 영역입니다. 기능별 그룹 일뿐입니다. 논리가 그리 많지는 않지만 모델로 이동하는 것은 잘못된 선택이 될 수 없습니다 :) 첫 번째 항목을 꺼내기 때문에 항목 크기에 1을 더하십시오. , 이제 길이는 -1이지만, 행 스팬은 아이템 길이가되어야합니다. – amitkaz

+0

글쎄, 추가 카운트 쿼리는 현재 그룹에 대한 아이템 수를 얻는 것뿐이었습니다. 마침내 렌더링 솔루션과 bobbywilson0의 named_scope을 사용하여 정렬/그룹화를 수행했습니다. – jhwist

0

하나의 해결책을 시도해 볼 수 있습니다 ... 먼저 각 정렬 키에 필요한 모든 행 간격의 해시를 가져옵니다. 각 행을 렌더링하고 같은

@rowspans = TestItem.count(:group => sortkey) 

그런 부분에서, 현재 sortkey에 행을 렌더링하는 경우

<% if testitem.sortkey != @current_sort_key %> 
    <% @current_sort_key = testitem.sortkey %> 
    <td rowspan="<%= @rowspans[@current_sort_key] -%>"> 
    <%= testitem.sortkey %> 
    </td> 
<% end %> 
... render the rest of row ... 

방법에 따라 ... 확인하는 인스턴스 변수를 설정 당신이보기에 마음에 들지 않도록 깨끗이하십시오. 이것은보기 자체가 아니라 도우미 내부에 더 잘 쓰여질 수 있습니다. 부분

<% @test_box.grouped_items.each do |sort_key, items| %> 
    <td rowspan="<% items.length %>"><%= render :partial => 'test_item', :collection => items %></td> 
<% end %> 

과 test_item에 : 당신이 할 수있는

class TestBox 
    named_scope :sorted_items, :sort_by => :sort_key, :id 

    def grouped_items 
    sorted_items.group_by(&:sort_key) 
    end 
end 

하고보기 :

<%= h item.sort_key %> 

나는 당신이 뭔가를 할 수있는 모델에서

1

이것이 당신이하고자하는 것을 정확히 줄 것이라고는 완전히 확신하지 못하지만 올바른 방향으로 당신에게 좋은 출발점을 제공 할 것입니다.

+0

다시 늦어 져서 죄송합니다.하지만 휴가가있었습니다. named_scope을 사용하여 정렬을 수행하는 트릭을 좋아합니다. 일부는 초이고 은 내부 여야하므로보기의 솔루션은 작동하지 않습니다. – jhwist