Rails基础知识 - 计算最常用的值

时间:2010-02-21 00:41:45

标签: ruby-on-rails

小部件has_one类型,并键入has_many小部件。我想计算哪些类型最常分配给我的小部件(使用前3个)。

实现这一目标的最佳方法是什么?

我构建数据库的方式是小部件表有一个type_id,在创建小部件时由select分配。

我想象这将是我在widget.rb模型中定义的一种方法,因为我需要在计算类型之前收集所有小部件,并且如果愿意的话给它们一个“得分”。

我想知道是否有更简单的方法来确定哪种类型最常用 - 我的目标是从模型中的方法返回它们,模型创建为数组并分配给变量控制器。

视图通过简单地调用数组的前三个值来拉出前三个。

1 个答案:

答案 0 :(得分:1)

我认为你的小部件应该belongs_to输入,因为小部件表将是持有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属性添加到belongs_to方法。

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)的内容,但命名范围将允许链接。