2013-01-04 37 views
0

開發一個類似於日常日誌的Web應用程序。用戶可以維護給定日期的幾個不同的數據列表。爲了討論的緣故,我們有兩種模式,便箋和任務。Rails數據模型按日期分組實體

我想向用戶展示他們可以通過顯示每個日期的數據來導航的日期。也許在嚴格的列表視圖,例如:

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開發人員會如何解決這個問題?你會使用哪種方法,還是完全不同?

尼克

做到這一點不改變模型的建立將是集團在journal_date列每個模型的範圍,然後遍歷從組哈希鍵的唯一列表,這樣

回答

1

方式一:

# 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時纔有效。如果它是一個日期時間,那麼你可以這樣解決它:

group_by { |journal_date| journal_date.to_date } 
+0

謝謝我會讀更多關於group_by。我並不反對改變我的模型,所以如果讓父模型實體將所有東西結合在一起有一些優點,我會考慮這一點,對此有何看法或最好是保持模型獨立? –

+0

只是從你的問題中得到的信息,我看不出有獨立的父模型的任何優勢。但是,這是從經典筆記和任務角度。如果你覺得你可能從中受益,那就試試看吧。 – DanneManne