Основы Rails - подсчет наиболее часто используемых значений - PullRequest
1 голос
/ 21 февраля 2010

Виджет имеет тип has_one и тип виджетов has_many. Я хотел бы подсчитать, какие типы наиболее часто назначаются моим виджетам (используются первые 3).

Как лучше всего это сделать?

То, как я структурировал базу данных, заключается в том, что таблица виджетов имеет type_id, который назначается выбором при создании виджета.

Я предполагал, что это будет метод, который я определю в модели моего widget.rb, так как мне нужно собрать все мои виджеты, прежде чем подсчитать типы и дать им «оценку», если хотите.

Мне интересно, есть ли более простой способ выяснить, какой из типов наиболее часто используется - моя цель - вернуть их из метода в модели, который создается как массив и назначается переменной в контроллер.

Представление, которое они отбирают из первых трех, просто вызывает первые три значения массива.

1 Ответ

1 голос
/ 21 февраля 2010

Я думаю, что ваши виджеты должны принадлежат_ к типу, поскольку таблица виджетов будет та, которая содержит type_id Далее я предлагаю использовать Rails counter_cache (прокрутите вниз до параметров).

Сначала вы запустите миграцию, например:

class AddTypesWidgetsCount < ActiveRecord::Migration
  def self.up
    change_table :types do |t|
      t.integer :widgets_count
    end
  end

  def self.down
    change_table :types do |t|
      t.remove :widgets_count
    end
  end
end

Затем добавьте атрибут :counter_cache => true в свой метод принадлежат_.

class Widget < ActiveRecord::Base
  belongs_to :type, :counter_cache => true
end

После этого вы можете создать область, которая сортирует типы по widgets_count. Модель вашего типа может выглядеть примерно так:

class Widget < ActiveRecord::Base
  has_many :widgets
  named_scope :top_three, :order => 'widgets_count DESC', :limit => 3
end

Затем вы можете позвонить Type.top_three, чтобы получить три верхних типа по количеству виджетов. Или без именованной области вы можете вызвать что-то вроде Type.find(:order => 'widgets_count DESC', :limit => 3), но именованная область разрешит связывание.

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