基于模型列数据查看循环[Rails]

时间:2013-11-20 04:29:58

标签: ruby-on-rails ruby-on-rails-4

这可能很简单,但我无法绕过它。我有一个名为“document”的模型和模型中的一个名为:category。

的字段

类别可以包含3个选项:

  • 会议记录
  • 销售
  • 工程

在我看来,我有:[index.html.erb]

<% @documents.each do |document| %>
  <div class="table-div">
    <div class="col-sm-12 col-md-12 div-table-label">
      <strong><%= document.category %></strong>
    </div>
    <div class="col-sm-12 col-md-12">
      <%= link_to document.title, document %>
    </div>
  </div>
<% end %>

在我的控制器中,只是默认值:

  def index
    @documents = Document.all
  end

我想要做的是遍历每个类别,并抓住与该类别相关的所有文档,将它们组合在一起。

现在,它只是按照创建的顺序打印每个文档及其类别标题,根本没有逻辑。

感谢。

4 个答案:

答案 0 :(得分:1)

  

我想要做的是遍历每个类别并获取所有文档   与该类别相关联,将它们组合在一起。

我从一个简单的方法开始按类别名称查找文档。为此,范围很棒:

class Document
  # ...
  scope :for_category, -> category_name { where(category: category_name) }
  # ...
end

然后,您可以遍历类别名称并查找该类别的所有文档,例如:

ALL_CATEGORIES = ["Meeting Notes", "Sales", "Engineering"]

All_CATEGORIES.each do |category|
  documents = Document.for_category(category)
  # Do something with the documents for this category...
end

当然,将这么多逻辑放入视图中并不是很理想,但扩展这个问题有点超出了这个问题的范围。如果好奇,请查看Avdi Grimm's Exhibit Pattern

答案 1 :(得分:1)

尝试

def index
   @documents = Document.where(true).order(:category).order(:title)
end

以便在数据库上完成排序,这可以更快,特别是如果您在类别列上有索引并按标题排序文档

更改视图以在遇到新类别时呈现标题

<% category = "" %>
<% @documents.each do |document| %>
  <div class="table-div">
    <% if category != document.category %>
    <div class="col-sm-12 col-md-12 div-table-label">
      <strong><%= document.category %></strong>
    </div>
    <% category = document.category %>
    <% end %>
    <div class="col-sm-12 col-md-12">
      <%= link_to document.title, document %>
    </div>
  </div>
<% end %>

答案 2 :(得分:1)

您总是可以在Document类中创建一个执行以下操作的静态方法:

class Document
    ...
    def self.all_by_category
        docs_by_category = {}
        all.each do |document|
            if docs_by_category.has_key? document.category
                docs_by_category[document.category] << document
            else
                docs_by_category[document.category] = [document]
            end
        end

        docs_by_category
    end

然后,您可以查看返回的哈希并打印出属于每个类别的文档,如下所示:

def index
    #you may want to change the name because it's misleading to leave it as @documents
    @documents_by_category = Document.all_by_cateogry # returns hash
end

然后

<% @documents_by_category.each do |category_name, documents|
       documents.each do |document| %>
           YOUR CODE HERE 
       <% end %>
<% end %>

但是,如果文档数量很高,则此方法可能效率低下。

为类别创建另一个数据库表可能更好,然后使用Category模型查询每个类别并获取其相关文档。

答案 3 :(得分:0)

你的意思是:

@categories.each do |cat|
  #  output cat.name or something
  cat.documents.each do |doc|
    # doc.name or whatever
  end
end

你显然需要在控制器中获取@categories

def index
  @categories = Category.all
end

或者您可以按类别

获取文档
def index
  @documents = Document.all.group_by(&:category)
end

请参阅here