根据创建的月份返回帖子列表

时间:2015-10-16 15:04:04

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

Rails新手在这里。

我在Rails 4.2中写博客,我希望在侧面导航栏中有链接,以根据创建帖子的月份过滤结果。我有正确显示的月份列表,但我无法显示包含正确过滤帖子的新索引页。

当用户点击侧面导航中的月份时,我想在params散列中发送该月份,然后使用if / else子句过滤结果。问题是我在视图中应用了strftime("%B")方法(以便月份更具可读性),然后将其传递给params哈希,但我无法应用它到控制器中的where子句。

在控制器中,我正在寻找类似的东西:

def index
  if params[:month]
    @posts = (:created_at.strftime("%B") => params[:month])
  else 
    @posts = Post.all
 end

但我得到错误信息:未定义的方法`strftime' for:created_at:Symbol

我认为的代码是:

<h4>By month </h4>
   <% @posts.group_by{|post| post.created_at.strftime("%B")}.each do |month, values| %>
      <%= link_to month, posts_path(:month => month) %>
   <% end %>

我设法得到类似帖子类别的东西,但这是因为在我用params哈希发送它之前我还没有运行任何方法。

控制器中的工作代码:

def index
   if params[:category]
    @posts = Post.where(:category => params[:category]).order(created_at: :desc)
   else
    @posts = Post.all
  end
end

视图中的工作代码:

<h4>By category</h4>
  <% @posts.group_by{|post| post.category}.each do |category, value| %>
    <%= link_to category, posts_path(:category => category) %>
  <% end %>

我很欣赏任何关于如何让它发挥作用的想法。提前谢谢。

更新 最后使用控制器中的索引操作中的以下代码管理以使其工作:

@posts = Post.where("trim(to_char(created_at, 'month')) = ?", params[:month].downcase)

3 个答案:

答案 0 :(得分:1)

您可以使用以下查询按月获取帖子:

Post.where("extract(month from created_at) = ?", params[:month])

我在Postgres数据库中试过这个。不确定这适用于Mysql。谢谢!

答案 1 :(得分:0)

也许值得尝试https://github.com/radar/by_star

有了这个宝石,你可以去Post.by_month(params[:month])

答案 2 :(得分:0)

您可以在模型中为其定义scope

scope :by_month, lambda { |date| where(:created_at => date.beginning_of_month..date.end_of_month).order(:created_at) }

这允许您在控制器列表操作中执行此操作:

selected_month = Time.parse(params[:month]) rescue Time.now
@posts = Post.by_month(selected_month)

要为每个独特的月份post生成链接,您可以map发布帖子,并为所有独特月份生成params[:month]的链接:

<% @posts.only(:created_at).map {|p| p.created_at.beginning_of_month}.uniq.sort.each do |m| %>
  <%= link_to m.strftime("%B"), :month => m %>
<% end %>