나는 이것을 가장 잘하는 방법을 찾으려고 노력하고있다. 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가 다소 하찮은 것처럼 보입니다. 어떤 아이디어가 코드를 기반으로 진행되고 있습니까? 나는 갱신이 만세가 일어난다는 것을 언급해야한다!
깊이 우선 탐색? http://en.wikipedia.org/wiki/Depth-first_search – jefflunt
그것이 귀하의 데이터 일 가능성이 있습니까? 손으로 관계를 확인할 수 있습니까? 중복 행이 없는지 확인하십시오. –
y - 네가 맞다는 것을 증명해 주겠다. 몇 가지 확인을 해보고 위의 편집을 제거하겠습니다.이 모든 것이 어떻게 이름이 붙여 졌는지 확인하는 것은 좋았지 만. 적어도 마법의 일부를 demistify. 굉장한 직업 - thx – timpone