2011-10-07 3 views
0

나는 이것을 가장 잘하는 방법을 찾으려고 노력하고있다. acts_as_tree 모델 (아래의 MenuHeader)을 통해 재귀 적으로 드릴 다운해야합니다. 나는 다음과 같은 모델이 : 중첩 된 방식으로 menu_headers의 모든을 통해 루프에Rails 3.1 acts_as_tree - 자녀를 결정 하시겠습니까? FormBuilder 개체에

class Menu < ActiveRecord::Base 
    has_many :menu_headers 
    accepts_nested_attributes_for :menu_headers 
end 

class MenuHeader < ActiveRecord::Base 
    belongs_to :menu 
    acts_as_tree :parent_id 
    has_many :menu_items 
    accepts_nested_attributes_for :menu_items 
end 

class MenuItem < ActiveRecord::Base 
    belongs_to :menu_header 
    has_one :price 
end 

내가 좋아하는 것을 같은 그 :

menu-1 
    menu_header -1 
     menu_item - 1 
     menu_item - 2 
    menu_header -2 
     menu_item - 3 
     menu_item - 4 
    menu_header -3 
     menu_item - 5 
    menu_header - 4 
     menu_header - 5 
      menu_item - 6 
      menu_item - 7 

과 실제 형태 (질문에 대한 ### 참조)

<%= form_for(@menu) do |f| %> 
    <div class="actions"> 
    <%= f.text_field :content %><br /> 
    <%= f.fields_for :menu_headers do |mh| %> 
     <%=mh.text_field :name %><br /> 
     <%= mh.fields_for :menu_items do |mi| %> 
     <%= mi.text_field :name %><br /> 
     <% end %> 
    <% ### wtf? - the next section should include the above frag in a partial %> 
     <% if fields_for :children? %> 
      <%= partial 'children' %> 
     <% end %> 
    <% end %> 
    <%= f.submit %> 
    </div> 
<% end %> 

위의 wft 부분은 어떻게해야합니까? FormBuilder 객체에 자식이 있는지 확인해야합니다 (필자는 생각합니다). 레일즈에서 처음으로 이런 일을했다.

들으

1 이 같은 모양 편집 번호는 그것의 일부 (그러나 거의 전체 부분)입니다 : 그래서 난

<% if mh.object.children.exists? %> 
    <%= render :partial => 'children' %> 
<% end %> 

편집 # 2 아이 중 하나의 중복 렌더링을 얻습니다. 내가 포함 한 내용 (메뉴 헤더가이 개 공간, 메뉴 항목 4 개 공간 들여 쓰기)

이어야 아래에 무슨 일이 일어나고 :

menu 1 
    mh 1, parent_id=nil 
     mi 1 - fk menu_header 1 
    mh 2 - parent_id=nil 
     mi2 - fk menu_header_id=2 
     mi3 - fk menu_header_id=2 
    mh 3 parent_id=2 
     mi 4, menu_header_id=3 
    mh 4 parent_id=2 
     mh 5 parent_id=4 
     mi 5, menu_header_id=5 
     mh 6 parent_id=5 

부모의 폼 값을 얻기 - 4

중복되는 두 번째 메뉴 헤더 #을
menu 1 - menu[content] 
mh 1, parent_id=nil - menu[menu_header_attributes][0][name] 
    mi 1 - fk menu_header 1 - menu[menu_headers_attributes][0][menu_items_attributes][0][name] 
mh 2 - parent_id=nil - menu[menu_headers_attributes][1][name] 
    mi2 - fk menu_header_id=2 - menu[menu_headers_attributes][1][menu_items_attributes][0][name] 
    mi3 - fk menu_header_id=2 - menu[menu_headers_attributes][1][menu_items_attributes][1][name] 
    mh 3 parent_id=2 - menu[menu_headers_attributes][1][children_attributes][0][name] 
     mi 4, menu_header_id=3 - menu[menu_headers_attributes][1][children_attributes][0][menu_items_attributes][0][name] 
    mh 4 parent_id=2 menu[menu_headers_attributes][1][children_attributes][1][name] 
    mh 5 parent_id=4 menu[menu_headers_attributes][1][children_attributes][1][children_attributes][0][name] 
     mi 5, menu_header_id=5 menu[menu_headers_attributes][1][children_attributes][1][children_attributes][0][menu_items_attributes][0][name] 
    mh 6 parent_id=5 menu[menu_headers_attributes][1][children_attributes][1][children_attributes][0][children_attributes][0][name] 
    mh 4 parent_id=2 menu[menu_headers_attributes][2][name] 
    mh 5 parent_id=4 menu[menu_headers_attributes][2][children_attributes][0][name] 
     mi 5, menu_header_id=5 menu[menu_headers_attributes][2][children_attributes][0][menu_items_attributes][0][name] 
     mh 6 parent_id=5 menu[menu_headers_attributes][2][children_attributes][0][menu_items_attributes][0][name] 
    mh 5 parent_id=4 - menu[menu_headers_attributes][3][name] 
     mi 5, menu_header_id=5 - menu[menu_headers_attributes][3][menu_items_attributes][0][name] 
     mh 6 parent_id=5 menu[menu_headers_attributes][3][children_attributes][0][name] 

여기에 무슨 일이 일어나고 있는지 살펴보면 children_attributes가 다소 하찮은 것처럼 보입니다. 어떤 아이디어가 코드를 기반으로 진행되고 있습니까? 나는 갱신이 만세가 일어난다는 것을 언급해야한다!

+0

깊이 우선 탐색? http://en.wikipedia.org/wiki/Depth-first_search – jefflunt

+0

그것이 귀하의 데이터 일 가능성이 있습니까? 손으로 관계를 확인할 수 있습니까? 중복 행이 없는지 확인하십시오. –

+0

y - 네가 맞다는 것을 증명해 주겠다. 몇 가지 확인을 해보고 위의 편집을 제거하겠습니다.이 모든 것이 어떻게 이름이 붙여 졌는지 확인하는 것은 좋았지 만. 적어도 마법의 일부를 demistify. 굉장한 직업 - thx – timpone

답변

1

죄송합니다.

<%= mh.object.children %>은 직접 자식 컬렉션을 제공 할 것이므로 전체 트리를 얻으려면 (patial의) 각 자식에 대해 재귀 호출 <%= mh.object.children %>을 호출해야합니다.

accepts_nested_attributes_for :children을 사용하면 속성을 설정할 수 있습니다.

편집 방법이 방법에 대한 :

<%= form_for(@menu) do |f| %> 
    <div class="actions"> 
    <%= f.text_field :content %><br /> 
    <%= f.fields_for :menu_headers do |mh| %> 
     <%= render :partial => 'menu_headers/form', :object => mh %> 
    <% end %> 
    <%= f.submit %> 
    </div> 
<% end %> 

app/views/menu_headers/_form.html.erb

<%= form.text_field :name %><br /> 
    <%= form.fields_for :menu_items do |mi| %> 
    <%= mi.text_field :name %><br /> 
    <% end %> 

    <%= form.fields_for :children do |mh| %> 
    <%= render :partial => 'form', :object => mh %> 
    <% end %> 

및 추가 : MenuHeader 모델

accepts_nested_attributes_for :children.

+0

나는 mh.object.children 문제를 보았지만 대답을 완전히 얻지는 못했다. 나를위한 미지의 영역에 조금있다. – timpone

+0

좀 더 의미가 있니? 위의 –

+0

위의 편집 - 이해가 (일종)하지만 뭔가가 아이의 숫자로 진행되고있을 수도 있습니다. 그것은 몇 가지를 복제하고 있습니다. - 초 안에 양식 입력 값으로 업데이트됩니다. – timpone