0

日誌のように機能する Web アプリケーションの開発。ユーザーは、特定の日付のデータのいくつかの異なるリストを維持できます。説明のために、Notes と Tasks の 2 つのモデルがあるとします。

各日付のデータを表示してナビゲートできる日付のビューをユーザーに提示したいと思います。たぶん、次のような厳密なリストビューで:

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 >>

または、対応するデータが何らかの形でマークまたは強調表示されている日付を持つカレンダーとして表示される場合もあります。

私は自分のモデルをただのメモとタスクとして構築する道を歩み始めました。それぞれにジャーナル日付があります。これは、各モデル インデックスを個別にナビゲートする場合にうまく機能します。myapp.com/notes/ や myapp.com/tasks/ などですが、各リストを日付ごとにグループ化された 1 つのビューに統合することがどれほど難しいかはわかりません。

また、journal_date、has_many のメモ、および has_many のタスクを持つ JournalEntry というモデルを用意することも検討しました。次に、メモとタスクには日付がありませんが、それぞれ日付のあるジャーナルエントリに属します。それは物事を少し単純化するだろうと思います。しかし、可能であればネストされたリソースに近づかないというブログ投稿をいくつか読みました。myapp.com/nick/journal_entries/2012-dec-23/​​tasks/ のようなものです。コードが複雑になるため、近づかないようにと言われています。

だから、経験豊富なレール開発者がこの問題にどのように取り組むのだろうか? どちらのアプローチを使用しますか、それともまったく異なる方法で処理しますか?

ニック

4

1 に答える 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)列がDateTimeではなくDate型である場合にのみ機能します。DateTime の場合は、代わりに次のように解決できます。

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