Rails数据模型按日期分组实体

时间:2013-01-04 03:36:54

标签: ruby-on-rails ruby-on-rails-3 data-modeling

开发一个类似于日常日记的Web应用程序。用户可以为给定日期维护几个不同的数据列表。为了便于讨论,我们有两个模型,Notes和Tasks。

我想向用户呈现他们可以浏览的日期,以显示每个日期的数据。也许在严格的列表视图中,例如:

Jan 1
======
Tasks: 1 - First task is here
       2 - Second task is here

Notes: 1 - First note is here


Jan 4
=====
Tasks:  No tasks

Notes:  1 - A note is here.
        2 - Another note...

<< Older Entries        Newer Entries >>

或者可能呈现为具有日期的日历,其具有以某种方式标记或突出显示的相应数据。

我开始构建我的模型的路径只是Notes和Tasks,每个都有一个journal_date。这在独立导航每个模型索引时工作正常。例如myapp.com/notes/或myapp.com/tasks/但我不确定将每个列表合并到按日期分组的一个视图中会有多困难。

我还考虑过一个名为JournalEntry的模型,它有一个journal_date,has_many notes和has_many任务。然后注释和任务没有日期,但它们都属于具有日期的journal_entry。我认为这会简化一些事情。但是我已经阅读了一些博客文章,如果可能的话,请远离嵌套资源。所以像:myapp.com/nick/journal_entries/2012-dec-23/​​tasks/他们说要远离,因为代码变得复杂。

所以我想知道一些更有经验的rails开发人员会如何解决这个问题?您会使用哪种方法,还是会以完全不同的方式处理它?

尼克

1 个答案:

答案 0 :(得分:1)

在不更改模型设置的情况下执行此操作的一种方法是将每个模型范围分组到journal_date列,然后循环遍历组哈希中的唯一键列表,如下所示:

# Controller
since_date = DateTime.now - 30.days
@tasks = Task.where("journal_date > ?", since_date).group_by(:journal_date)
@notes = Note.where("journal_date > ?", since_date).group_by(:journal_date)
@date_entries = (@tasks.keys + @notes.keys).uniq

# View
<% @date_entries.each do |date_entry| %>
  <h1><%= date_entry.to_s %></h1>
  <h2>Tasks</h2>
  <% if @tasks[date_entry].any? %>
    <% @tasks[date_entry].each do |task| %>
      <p><%= task.title %></p>
    <% end %>
  <% else %>
    <p>No Tasks</p>
  <% end %>

  <h2>Notes</h2>
  <% if @notes[date_entry].any? %>
    <% @notes[date_entry].each do |note| %>
      <p><%= note.title %></p>
    <% end %>
  <% else %>
    <p>No Notes</p>
  <% end %>
<% end %>

since_date部分当然只是为检索到的记录设置一些条件的一个例子。

只有当列的类型为Date而不是DateTime时,group_by(:journal_date)才会起作用。如果它是DateTime,那么你可以这样解决它:

group_by { |journal_date| journal_date.to_date }