Группируйте и сортируйте сообщения в блогах по дате в Rails - PullRequest
1 голос
/ 28 апреля 2010

Я искал по всей сети и не нашел ответа. Я пытаюсь использовать очень стандартную опцию архивирования для моего блога на основе даты. Запрос URL-адреса blog.com/archive/2009 показывает все сообщения за 2009 год, blog.com/archive/2009/11 показывает все сообщения за ноябрь 2009 года и т. Д. Я нашел два разных кода, но они мне не очень помогли.

def display_by_date
 year = params[:year]
 month = params[:month]
 day = params[:day]
 day = '0'+day if day && day.size == 1
 @day = day
 if (year && month && day)
   render(:template => "blog/#{year}/#{month}/#{date}")
 elsif year
  render(:template => "blog/#{year}/list")
 end
end

def archive
 year = params[:year]
 month = params[:month]
 day = params[:day]
 day = '0'+day if day && day.size == 1
 if (year && month && day)
   @posts_by_month = Blog.find(:all, :conditions => ["year is?", year])
 else
   @posts_by_month = Blog.find(:all).group_by { |post| post.created_at.strftime("%B") }
 end
end

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2015

Я обновил ответ sent-hil для Rails 4. Как и с ним, я не знаю, является ли это «хорошим» кодом, но, похоже, он работает для меня. Я обновлю этот пост, если найду / внесу какие-либо улучшения.

  def archive
    year = params[:year]
    month = params[:month]
    day = params[:day]

    if (year && month && day)
      requested_date = Date.new(year.to_i, Date.parse(month).month.to_i, day.to_i)
      from = requested_date - 1
      to = requested_date + 1
      @posts = Post.find_by_sql([ "SELECT * FROM posts WHERE created_at BETWEEN ? AND ?", from, to])
    elsif (year && month)
      requested_month = Date.new(year.to_i, Date.parse(month).month.to_i)
      end_month = requested_month.end_of_month
      @posts = Post.find_by_sql([ "SELECT * FROM posts WHERE created_at BETWEEN ? AND ?", requested_month, end_month ])
    else
      requested_year = Date.new(year.to_i)
      @posts = Post.find_by_sql([ "SELECT * FROM posts WHERE created_at BETWEEN ? AND ?", requested_year, requested_year.end_of_year ])
    end
  end

#routes.rb
  match ':controller/:action/:year/(:month)/(:day)', via: [:get],
    :controller => "posts",
    :action => "archive",
    :year => /\d{4}/,
    :month => /\w+/,
    :day => /\d{2}/

Вместо блога я использовал «посты» и пути в форме www.site.com/posts/archive/2015/September/20

0 голосов
/ 28 апреля 2010

Редактировать: мне удалось заставить его работать. Если вы переходите на «блог / 2010», вы видите все сообщения, сделанные в 2010 году, а если вы переходите на «блог / 2010 / апрель», вы видите все сообщения, сделанные в апреле 2010 года и т. Д.

def archive
 year = params[:year]
 month = params[:month]
 day = params[:day]
 if (year && month && day)
  requested_date = Date.new(year.to_i, Date.parse(month).month.to_i, day.to_i)
  from = requested_date - 1
  to = requested_date + 1
  @posts_by_month = Blog.find(:all, :conditions => ["due BETWEEN ? AND ?", from, to])
 elsif (year && month)
  requested_month = Date.new(year.to_i, Date.parse(month).month.to_i)
  end_month = requested_month.end_of_month
  @posts_by_month = Blog.find(:all, :conditions => ["due BETWEEN ? AND ?", requested_month, end_month])
 else
  requested_year = Date.new(year.to_i)
  @posts_by_month = Blog.find(:all, :conditions => ["created_at BETWEEN ? AND ?", requested_year, requested_year.end_of_year ])
 end
end

#routes.rb
map.connect 'blog/:year/:month/:day',
:controller => 'blogs',
:action => 'archive',
:year => /\d{4}/,
:month => /\w{3}/,
:day => /\d{2}/,
:day => nil,
:month => nil

Я не знаю, является ли это «хорошим» кодом, но я уверен, что кто-то может сделать его еще лучше. Я был бы признателен, если бы кто-то сделал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...