小部件has_one类型,并键入has_many小部件。我想计算哪些类型最常分配给我的小部件(使用前3个)。
实现这一目标的最佳方法是什么?
我构建数据库的方式是小部件表有一个type_id,在创建小部件时由select分配。
我想象这将是我在widget.rb模型中定义的一种方法,因为我需要在计算类型之前收集所有小部件,并且如果愿意的话给它们一个“得分”。
我想知道是否有更简单的方法来确定哪种类型最常用 - 我的目标是从模型中的方法返回它们,模型创建为数组并分配给变量控制器。
视图通过简单地调用数组的前三个值来拉出前三个。
答案 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)
的内容,但命名范围将允许链接。