2012-02-13 5 views
0

私はユーザーがイベントを保存できるアプリケーションを持っています。私は過去1週間にどのイベントが最も保存されているのかを知ることができるようにしたいと考えています。これを行うために、私はイベントモデルで「トレンド」機能を作成し、それを私の視点でアクセスしようとしました。それはエラーを返します。モデルから集計データを返すにはどうすればよいですか?

_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 db)でそれをコード化することを決めました。そうすれば、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 

だから、この関数によって返されるべき行がフィールドだけのタイトル、EVENT_ID、およびsave_countを含める必要があります。なぜis_publicを探しているのですか?私は何とかEventオブジェクトの実際のインスタンスが期待されるという印象を受けます。それが事実ならば、私はこれをどのように書き直すのですか? is_publicについての質問に応答した

更新: is_publicは間違いなくsaved_eventsの列です。私は移行を実行しました。これをさらに分離するために、SQLからAND saved_events.is_public = TRUEを削除しても、同じエラーが発生しました。 SQLが有効で、pgAdminで動作することを確認しました。

+0

地域is_publicは列ですか。 – nodrog

答えて

1

この問題は、APIに記載されているように、find_by_sqlの動作に起因すると考えられます。

あなたが複数のテーブルにまたがる複雑なSQLクエリを呼び出す場合SELECTで指定された列は、彼らが対応するテーブルの列かどうかを、モデルの属性になります。 http://apidock.com/rails/ActiveRecord/Base/find_by_sql/class

は、私は、クエリレールウェイ™を書き直しし、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を探しています。 移行を実行しましたか? "production_events.is_public = TRUE"

関連する問題