Rails 3.2具有多个连接的ActiveRecord查询

时间:2012-03-08 20:47:18

标签: activerecord join ruby-on-rails-3.1

我在尝试正确连接表数据并将其呈现到视图中时遇到问题。我目前正在设计一个系统,所以我的餐厅客户可以创建动态菜单并在菜单页面上正确显示它们。目前我有一个Menu,MenuItem和Section模型。我已经成功创建了表单,我可以将menu_items分配给菜单并将menu_item与一个部分相关联。我的问题是呈现前端菜单。我希望我的菜单看起来像以下模板。任何帮助将不胜感激。

Menu Name
  First Section
    Menu Item
    Menu Item
    ...
  2nd Section
    Menu Item
    Menu Item
  ...

我的模型和协会如下所示。

在Menu.rb中

class Menu < ActiveRecord::Base
  has_many :menu_menu_items, :dependent => :delete_all
  has_many :menu_items, :through => :menu_menu_items
在MenuItem.rb中

class MenuItem < ActiveRecord::Base
  has_many :menu_menu_items
  has_many :menus, :through => :menu_menu_items
  belongs_to :sections
Section.rb中的

class Section < ActiveRecord::Base
  has_many :menu_items,  :dependent => :nullify

到目前为止,我认为我有以下内容。这是我真正缺乏对Rails和ActiveRecord如何工作的理解,所以我可以正确地创建这个视图。我还需要知道的一件事是,如果一个部分没有特定菜单的menu_items,我该如何将其排除?

<div class="content">

  <% @menus.each do |menu| %>
    <h3><%= menu.name %> <br/></h3>
    <% Section.all.each do |section| %>
      <b><%= section.name %><br/></b>
      <% menu.menu_items.each do |menu_items| %>
        &nbsp;&nbsp;&nbsp;<%= menu_items.name %> <br/>
      <% end %>
    <% end %>
  <% end %>

</div>

&LT; --------------------------------------------- ------------ 修改 ------------------------------ ----------------------------------&GT;

我现在有以下代码正常工作。这为我提供了仅属于特定菜单的部分和相应的菜单项。我唯一需要帮助的是如果没有菜单在该部分中有项目,代码仍会输出一个空部分。有什么指导吗?

<% @menus.each do |menu| %>
  <h3><%= menu.name %> <br/></h3>
  <% Section.all.each do |section| %>
    <b><%= section.name %><br/></b>
    <% menu.menu_items.where(:section_id => section.id).each do |menu_items| %>
      &nbsp;&nbsp;&nbsp;<%= menu_items.name %> <br/>
    <% end %>
  <% end %>
<% end %>

&LT; --------------------------------------------- ------------ 编辑2 ----------------------------- -----------------------------------&GT;

我能够导出我需要的SQL,以便拉出属于特定菜单的部分。我该如何实现它?

select count(sections.id),sections.name
from menu_items 
  join menu_menu_items on menu_items.id=menu_menu_items.menu_item_id
  join menus on menus.id=menu_menu_items.menu_id 
  join sections on menu_items.section_id= sections.id 
where menu_id=16  #for example.
group by sections.id;  

0 个答案:

没有答案