Ruby on Rails: agrupamento posts por mês
-
22-08-2019 - |
Pergunta
caras Hy. Eu criei um aplicativo simples blog com as ações habituais CRUD. Eu também acrescentou uma nova ação na PostController chamado "arquivo" e uma vista associada. Nesta visão eu quero trazer de volta todos os posts e agrupá-los por mês, exibindo-os neste tipo de formato:
March
<ul>
<li>Hello World</li>
<li>Blah blah</li>
<li>Nothing to see here</li>
<li>Test post...</li>
</ul>
Febuary
<ul>
<li>My hangover sucks</li>
... etc ...
Não consigo para a vida de me descobrir a melhor maneira de fazer isso. Assumindo o modelo Post tem o title
de costume, content
, created_at
etc campos, alguém pode me ajudar com a lógica / code? Eu sou muito novo para RoR tão urso por favor comigo:)
Solução
group_by é um ótimo método:
controlador:
def archive
#this will return a hash in which the month names are the keys,
#and the values are arrays of the posts belonging to such months
#something like:
#{ "February" => [#<Post 0xb5c836a0>,#<Post 0xb5443a0>],
# 'March' => [#<Post 0x43443a0>] }
@posts_by_month = Posts.find(:all).group_by { |post| post.created_at.strftime("%B") }
end
modelo de visão:
<% @posts_by_month.each do |monthname, posts| %>
<%= monthname %>
<ul>
<% posts.each do |post| %>
<li><%= post.title %></li>
<% end %>
</ul>
<% end %>
Outras dicas
@Maximiliano Guzman
Boa resposta! Obrigado por adicionar valor para a comunidade Rails. Eu estou incluindo minha fonte original na Como criar um Blog Archive com Rails , apenas no caso eu açougueiro raciocínio do autor. Baseado no post, para novos desenvolvedores Rails, eu gostaria de acrescentar algumas sugestões.
Primeiro, use registos activos Posts.all para retornar o conjunto de resultados Post para maior velocidade e interoperabilidade. O Posts.find (: all). método é conhecido por ter problemas imprevistos
Finalmente, ao longo da mesma linha, uso beginning_of_month método das extensões do núcleo ActiveRecord. Acho beginning_of_month muito mais legível do que strftime ( "% B") . Claro, a escolha é sua.
A seguir é um exemplo dessas sugestões. Consulte o post original para mais detalhes:
Controladores / archives_controller.rb
def index
@posts = Post.all(:select => "title, id, posted_at", :order => "posted_at DESC")
@post_months = @posts.group_by { |t| t.posted_at.beginning_of_month }
end
views / arquivos / indext.html.erb
<div class="archives">
<h2>Blog Archive</h2>
<% @post_months.sort.reverse.each do |month, posts| %>
<h3><%=h month.strftime("%B %Y") %></h3>
<ul>
<% for post in posts %>
<li><%=h link_to post.title, post_path(post) %></li>
<% end %>
</ul>
<% end %>
</div>
Boa sorte e bem vindo ao Rails!