【问题标题】:Ruby on Rails Nesting BlocksRuby on Rails 嵌套块
【发布时间】:2010-02-07 18:13:46
【问题描述】:

我有一个块,我需要在其中嵌套另一个块。或者我没有,我这样做完全错误。 有一个 UNIT 并且 UNIT has_many COMPANIES 那么 COMPANIES has_many USERS

在 UNIT 显示页面上,我正在尝试执行以下操作:

<% @company.each do |c|%>
 <%= c.name %>
  <% ??? each do |f| %>
   <p>
   Name: <%= f.name %>
      </p>
<% end %>
<% end %>

因此,基本上对于每家公司,我都会显示公司的名称,那里没有问题,但是我试图表明在每家公司中,我列出的特定用户属于该公司。我无法在控制器中定义它,因为有多家公司。

该用户是: cc = @user.find(:all, :conditions => ["position = ?", "Company Commander"])

我不知道如何遍历每个公司,然后为该公司遍历并列出该公司的特定用户。

对不起,如果我解释得不好。我不确定这是否是正确的方法。

提前致谢。

【问题讨论】:

    标签: ruby-on-rails loops


    【解决方案1】:

    试试这个:

    <% @company.each do |c| %>
      <%= h(c.name) %>
      <% c.users.each do |u| %>
        <p>Name: <%= h(u.name) %></p>
      <% end %>
    <% end %>
    

    【讨论】:

      【解决方案2】:

      首先,您需要在模型中定义关系:

      # Unit model
      has_many :companies
      has_many :users, :through => :companies
      
      # Company model
      has_many :users
      belongs_to :unit
      
      ...
      

      比在您的单元控制器中:

      @unit = Unit.find(params[:id]) # or something similar
      

      在你看来:

      <% @unit.companies.each do |c|%>
       <%= c.name %>
        <% c.users each do |f| %>
         <p>
           Name: <%= f.name %>
         </p>
        <% end %>
      <% end %>
      

      【讨论】:

        【解决方案3】:

        您似乎想列出与每个公司关联的“公司指挥官”职位的用户。

        也许用户的命名范围会有所帮助:

        class User < ActiveRecord::Base
          ...
          named_scope :company_commanders, :conditions => "position = 'Company Commander'"
        end
        

        现在您可以根据需要循环遍历它们。

        <% @company.each do |c|%>
         <%= c.name %>
         <% c.users.company_commanders each do |f| %>
           <p>
             Name: <%= f.name %>
           </p>
         <% end %>
        <% end %>
        

        【讨论】:

        • 感谢 named_scope 是个好主意。所以现在我在下面(如果我还没有具有该职位的用户,则 if..else 将涵盖),但添加该范围不会导致任何内容显示。任何想法为什么?



          姓名:

        • 很抱歉,将其放在评论中并不是很有帮助,尽管如此,我一问我解决了的问题,我就把它放在了答案中。再次感谢您提醒我 named_scopes。
        • 使用空的?而不是零?如果未找到任何结果,则命名范围将返回一个空列表。哪个在 nil 上返回 false?。
        • 谢谢,这就是我最终所做的,您对我很有帮助,感谢。
        【解决方案4】:

        如果一家公司有很多用户,那么您应该能够只执行“company.users”来获取与该公司关联的用户列表。然后你可以循环浏览或列出你喜欢的那些。

        假设您在模型中设置了关系,这就是活动记录为您设置这些关联的方式。

        【讨论】:

          【解决方案5】:

          这就是最终的工作:

          named_scope :company_commanders, :conditions =>{:position => 'Company Commander'}
          
          <% @company.each do |c| %>
            <%= h(c.name) %><br />
            <% if c.users.company_commanders.blank? %>
              <%= link_to "Add this User", new_user_path %><br />
            <% else %>
              <% c.users.company_commanders.each do |u| %>
                  <p>Name: <%= h(u.name) %></p>
              <% end %>
            <% end %>
          <% end %>
          </p>
          

          【讨论】:

            猜你喜欢
            • 2018-12-28
            • 2011-06-02
            • 1970-01-01
            • 1970-01-01
            • 2011-01-11
            • 2011-05-25
            • 2011-01-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多