2010-12-28 2 views
9

Я использую meta_search для сортировки столбцов в таблице. Один из моих столбцов таблицы - это количество связанных записей для конкретной модели.Rails meta_search gem: сортировать по счету связанной модели

В основном это так:

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 

В моем магазине зрения # указательным У меня есть таблица, в которой перечислены вне current_inventory_count для каждого магазина. Есть ли способ использовать meta_search для заказа магазинов по этому счету?

Я не могу использовать мой метод current_inventory_count, так как meta_search может использовать только пользовательские методы, которые возвращают тип ActiveRecord :: Relation.

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

Любые идеи?

Я использую Rails 3.0.3 и новейший meta_search.

+0

бы мой лучший вариант будет просто добавить «current_inventory_records_count» колонку дб для магазинов, которые я просто убедитесь, что всегда правильно с помощью before_save-х ? – jfeust

ответ

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/

+0

Отлично, спасибо! – jfeust

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

+0

Спасибо, это хорошо знать, но я хочу считать только записи инвентаря, отмеченные как «текущие». – jfeust

+0

has_many: inventory_records,: conditions => {: current => true},: counter_cache => true – Unixmonkey

+0

это не будет работать с ассоциацией HABTM, к сожалению – CharlieMezak