2012-02-13 58 views
0

我有一個允許用戶保存事件的應用程序。我希望能夠看到哪些活動在過去一週內保存得最多。爲此,我在Event模型中創建了一個「趨勢」功能,然後嘗試在我的視圖中訪問該功能。這會返回一個錯誤。如何從我的模型中返回聚合數據?

_trending.html.erb:

missing attribute: is_public 
Extracted source (around line #3): 

1: 
2: <% 
3: events = Event.trending(:timespan => 1.week, :limit => 25) 
4: %> 

這是我的事件模型的趨勢功能。我決定在原始SQL(postgres數據庫)中編寫代碼,這樣就不會對ActiveRecord如何構建我的查詢產生困惑。

event.rb:

def self.trending(options={}) 
    limit = options[:limit] 
    span = options[:timespan] 

    earliest_save = (Time.now - span) 
    event_sql = %(SELECT events.title, saved_events.event_id, COUNT(user_id) as save_count, MAX(saved_events.created_at) as created 
       FROM saved_events, events 
       WHERE events.id = saved_events.event_id AND saved_events.is_public = TRUE AND saved_events.created_at >= '#{earliest_save}' 
       GROUP BY saved_events.event_id, events.title 
       ORDER BY save_count DESC, created DESC 
       LIMIT #{limit}) 

    find_by_sql("#{event_sql}") 
end 

所以應該由這個函數返回的行應該只包含的字段名稱,事項標識,並save_count。爲什麼要尋找is_public?我覺得它不知何故需要一個Event對象的實際實例。如果是這樣的話,我該如何重寫呢?

更新回覆關於is_public的問題: is_public絕對是saved_events中的一列。我確實運行了遷移。爲了進一步隔離,我從SQL中刪除了'AND saved_events.is_public = TRUE',並且仍然得到相同的錯誤。 SQL是有效的,我檢查它是否在pgAdmin中有效。

+0

您確定is_public的區域是列嗎? – nodrog 2012-02-13 23:03:14

回答

1

我認爲這個問題源於find_by_sql的工作方式,如API中所述。

如果您調用跨多個表的複雜SQL查詢,SELECT指定的列將是模型的屬性,而不管它們是否爲相應表的列。 http://apidock.com/rails/ActiveRecord/Base/find_by_sql/class

我重寫了查詢Rails的方式™,並能擺脫SELECT語句。此代碼完美工作。

time_range = (Time.now - span)..Time.now 
joins(:saved_events).where(:saved_events => { :created_at => time_range, :is_public => true }) 
        .group("saved_events.event_id, events.id") 
        .order("COUNT(saved_events.user_id) DESC, MAX(saved_events.created_at) DESC") 
        .limit(limit) 
0

Nodrog是對的,它尋找is_public。 您是否運行遷移? (如果生產重新啓動),如果該列不應該存在刪除行:「saved_events.is_public = TRUE」