2010-10-30 34 views
0

好的,這裏是我在StackOverflow上問過的最棘手的問題。Rails - News Feed

我的Web應用程序允許創建文檔。這個文件自動保存讓我們說幾秒鐘。

同時,我想要一個新聞提要,讓用戶知道朋友在做什麼。所以我創建了一個觀察者模型,after_create創建一個news_feed類型的項目。

問題是這個觀察者,現在將創建一個news_feed永遠保存這是一個巨大的firehose。

所以我想這樣做,這個模型的news_feed只注入每個會話或每X分鐘。所以我給模型添加了一個last_feeded_at列。

問題是,當我嘗試更新觀察者中的該字段以標記該字段受到影響時,觸發觀察者,這會造成一切混亂。

什麼是處理這個最好的方法是什麼?我願意接受所有聰明的建議。

感謝

回答

0

我會用這樣的邏輯

def find_or_create_feed 
    if session[:news_feed].nil? 
    NewsFeed.new 
    else 
    NewsFeed.find(session[:news_feed]) 
    end 
end 

這樣的創建你的新聞源對象,就可以返回相同的NewsFeed對象的整個會話。如果您希望獲得幻想並使其到期,請定期掃描news_feeds表以刪除特定年齡段的Feed。

+0

@史蒂夫,謝謝,但這住在哪裏?你能否提供一些關於用例的更多背景知識?真正興奮地學習一種更聰明的方式來做我想做的事情。我的代碼越來越雜亂!謝謝 – AnApprentice 2010-10-30 05:43:05

+0

嗯,它是你的應用程序,但我認爲你有一個控制器,根據你所描述的,處理用戶在創建和編輯文檔方面的交互。同樣,從您的描述中可以看出,您希望在給定會話中首次訪問文檔時創建新聞Feed。所以,我想我會說在before_filter中將它命中並將結果賦給一個實例變量,以便您的視圖可以顯示它。或者...有可能我錯過了這個功能的意圖。 – 2010-10-30 06:14:30

+0

控制器只應在模型上執行1個動作,例如保存文檔的更新。文檔模型應該執行任何相關的操作。 – Ariejan 2010-10-30 08:39:48

2

我不會爲此添加屬性文檔模型。你可能有這樣的事情已經:

class Document 
    has_many :news_feeds, :order => 'created_at DESC' 
end 

在你的回調(在文檔模型),只是檢查當最後news_feed創建:

after_save :create_news_feed, :if => Proc.new { |doc| doc.news_feeds.first.created_at <= 10.minutes.ago } 

這隻會叫create_news_feed如果最後news_feed是至少10分鐘前創建。

+0

剛剛注意到您的會話要求。將「attr_accessor:session_id」添加到您的Document模型,並將該值與您創建的每個new_feed記錄一起存儲。相應地更新':if'語句。 – Ariejan 2010-10-30 08:40:43

+0

OP需要每次會話的新聞提要。爲什麼不根據會話而不是年齡創建新聞提要? – 2010-10-30 16:06:28

+0

有趣的是,我試圖在OBserver中完成所有這些操作,以保持它的獨立性。 – AnApprentice 2010-10-30 16:33:08

1

我假設當用戶完成編輯時,他們執行最後的保存?定義一個attr_accessor,draft,它在處理request.js ajax保存時作爲參數從控制器發送。我並不認爲真正需要觀察員,只是把它放在模型中。

attr_accessor :draft 
after_save :log_unless_draft 

def log_unless_draft 
    unless draft.eql?(true) 
    log_event.new(... 

順便說一句,我不這樣做,明白爲什麼after_create甚至引發給出這些都不是new_record?的超越了先保存。

+0

添加一點點顏色。當用戶點擊New Note時,會創建一個Note,然後用戶被重定向到該筆記以開始輸入。由於Note Title尚未設置,因此當時我不需要新聞訂閱源項目。這就是爲什麼我只想餵它一次,因爲標題是註釋無標題.... – AnApprentice 2010-10-30 16:29:15

+0

此外,沒有最終的保存,它更像谷歌文檔,註釋是自動保存到服務器(DEF更新)在計時器和基於用戶活動。正是那些淹沒Feed並且我想管理的節省。那有意義嗎? – AnApprentice 2010-10-30 16:30:06

+0

儘管谷歌文檔確實有一個(最終)保存按鈕,但對氾濫有意義;我個人認爲這將是不好的界面設計。用戶預計完成後即可保存,這將是登錄到提要的理想時間。 – mark 2010-10-30 17:09:27