подсчитывать и извлекать объекты полиморфной ассоциации - PullRequest
1 голос
/ 15 января 2012

Итак, у меня есть три модели

"Text" has_many :statistics, :as => :loggable
"Document" has_many :statistics, :as => :loggable
"Statistic" belongs_to :loggable, :polymorphic => true
"Company" has_many "Documents"/"Texts"

Теперь я хочу получить различные результаты, например

  • получить общее количество статистических объектов всех объектов текста / документакомпании
  • получить общее количество объектов статистики всех объектов текста / документов компании в этом месяце
  • получить первые пять текстов / документов компании с наибольшим количеством объектов статистики
  • получить первые пять текстов / документов компании с наибольшим количеством объектов статистики в этом месяце

Этот месяц связан с датой создания объекта статистики.

iдействительно понятия не имею, как этого добиться.я пробовал разные вещи в консоли рельсов, но без удачи.

company.texts
company.documents

есть идеи, как это сделать?заранее спасибо.Пожалуйста, оставьте комментарий, если что-то неясно.

Ответы [ 2 ]

5 голосов
/ 15 января 2012

Первые 2 довольно просты.

получить общее количество объектов статистики для всех объектов текста / документа

Statistic.where(:loggable_type => "Text").where(:loggable_id => company.texts)

получить общее количество объектов статистики для всех объектов текста / документа в этом месяце

Statistic.where('created_at between ? and ?', 1.month.ago, Time.now).where(:loggable_type => "Text").where(:loggable_id => d.texts).count

получить первые пять текстов / документов компании с наибольшим количеством статистических объектов

ids = Statistic.select("COUNT(*) AS count_all").where(:loggable_type => "Text").where(:loggable_id => company.texts).group(:loggable_id).order("count_all desc").limit(5).size
Text.where(:id => ids)

получить первые пять текстов / документов компании с наибольшим количеством статистических объектов в этом месяце

ids = Statistic.select("COUNT(*) AS count_all").where('created_at between ? and ?', 1.month.ago, Time.now).where(:loggable_type => "Text").where(:loggable_id => d.texts).group(:loggable_id).order("count_all desc").limit(5).size
Text.where(:id => ids)
0 голосов
/ 15 января 2012

Попробуйте с

company.texts.join(:statistics).where('statistics.created_at between ? and ?', Time.now, 1.month.ago)

и

company.documents.join(:statistics).where('statistics.created_at between ? and ?', Time.now, 1.month.ago)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...