Как я могу вернуть совокупные данные из моей модели? - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть приложение, которое позволяет пользователям сохранять события.Я хотел бы видеть, какие события сохраняются больше всего за последнюю неделю.Чтобы сделать это, я создал «трендовую» функцию в моей модели событий, а затем попытался получить доступ к ней в моем представлении.Это возвращает ошибку.

_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

Итак, строки, которыеВозвращаемое этой функцией должно включать только поля title, event_id и save_count.Почему он ищет is_public?У меня складывается впечатление, что он каким-то образом ожидает фактический экземпляр объекта Event.Если это так, то как мне переписать это?

Обновление в ответ на вопросы об is_public: is_public - это определенно столбец в save_events.Я запустил миграцию.Чтобы изолировать это дальше, я удалил «И сохраненные_events.is_public = TRUE» из SQL и все еще получил ту же ошибку.SQL допустим, и я проверил, что он работает в pgAdmin.

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Я думаю, что проблема связана с тем, как работает find_by_sql, как описано в API.

Если вы вызываете сложный запрос SQL, который охватывает несколько таблиц, столбцы, указанные в SELECT, будут атрибутамимодель, являются ли они столбцами соответствующей таблицы.http://apidock.com/rails/ActiveRecord/Base/find_by_sql/class

Я переписал запрос Rails-way ™ и смог избавиться от оператора 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 голосов
/ 14 февраля 2012

Нодрог прав, его ищут is_public.Вы управляли своей миграцией?(и перезапустить, если производство), если этот столбец не должен существовать, удалите строку:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...