Rails meta_search gem:按关联模型的计数排序

时间:2010-12-28 18:21:00

标签: ruby-on-rails activerecord meta-search

我正在使用meta_search对表格中的列进行排序。我的一个表列是特定模型的相关记录的计数。

基本上就是这样:

class Shop < ActiveRecord::Base
  has_many :inventory_records

  def current_inventory_count
    inventory_records.where(:current => true).count
  end
end

class InventoryRecord < ActiveRecord::Base
  belongs_to :shop

  #has a "current" boolean on this which I want to filter by as well
end

在我的Shop #index视图中,我有一个表格列出了每个商店的current_inventory_count。无论如何使用meta_search按此计数订购商店?

我无法使用current_inventory_count方法,因为meta_search只能使用返回ActiveRecord :: Relation类型的自定义方法。

我能想到这样做的唯一方法是做一些自定义SQL,其中包括“虚拟”列中的计数,并按此列进行排序。我不确定这是否可能。

任何想法?

我正在使用Rails 3.0.3和最新的meta_search。

2 个答案:

答案 0 :(得分:8)

向结果集中添加额外的列...

在Shop.rb ..

scope :add_count_col, joins(:inventory_records).where(:current=>true).select("shops.*, count(DISTINCT inventory_records.id) as numirecs").group('shops.id')

scope :sort_by_numirecs_asc, order("numirecs ASC")
scope :sort_by_numirecs_desc, order("numirecs DESC")

在shops_controller.rb索引方法

@search = Shop.add_count_col.search(params[:search])
#etc.

在index.html.erb

<%= sort_link @search, :numirecs, "Inventory Records" %>

在此处找到sort_by__asc参考:http://metautonomo.us/2010/11/21/metasearch-metawhere-and-rails-3-0-3/

答案 1 :(得分:4)

Rails有一个内置的解决方案,叫做counter_cache

在商店桌面上创建名为“inventory_records_count”的表格列。

class Shop < ActiveRecord::Base
  has_many :inventory_records, :counter_cache => true
end

http://asciicasts.com/episodes/23-counter-cache-column