【问题标题】:Rails Data Model Grouping Entities By DateRails 数据模型按日期对实体进行分组
【发布时间】:2013-01-04 12:27:32
【问题描述】:

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

尼克

【问题讨论】:

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


    【解决方案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 }
    

    【讨论】:

    • 谢谢,我会在 group_by 上阅读更多内容。我不反对改变我的模型,所以如果有一个父模型实体将所有东西联系在一起有一些优势,我也会考虑这一点,对此有什么想法还是最好保持模型独立?跨度>
    • 仅根据您问题中的信息,我真的看不出拥有单独的父模型的任何优势。但这是从经典笔记和任务的角度来看的。如果你觉得你可能会从中受益,那就试试吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2023-02-07
    相关资源
    最近更新 更多