这可能很简单,但我无法绕过它。我有一个名为“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
我想要做的是遍历每个类别,并抓住与该类别相关的所有文档,将它们组合在一起。
现在,它只是按照创建的顺序打印每个文档及其类别标题,根本没有逻辑。
感谢。
答案 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