0

开发一个类似于日报的 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 开发人员会如何解决这个问题?您会使用哪种方法,或者您会以完全不同的方式处理它?

缺口

4

1 回答 1

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部分当然只是为检索到的记录设置一些条件的示例。

并且group_by(:journal_date)仅当列的类型为 Date 而不是 DateTime 时才有效。如果它是 DateTime 那么你可以这样解决它:

group_by { |journal_date| journal_date.to_date }
于 2013-01-04T04:22:21.733 回答