2010-12-28 14 views
9

Sto usando meta_search per ordinare le colonne in una tabella. Una delle colonne della mia tabella è un conteggio dei record associati per un particolare modello.Rails meta_search gem: ordina per il conteggio di un modello associato

In sostanza è questo:

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 

nel mio negozio vista # indice Ho una tabella che elenca le current_inventory_count per ogni negozio. Esiste comunque la possibilità di utilizzare meta_search per ordinare i negozi in base a questo conteggio?

Non riesco a utilizzare il mio metodo current_inventory_count poiché meta_search può utilizzare solo metodi personalizzati che restituiscono un tipo ActiveRecord :: Relation.

L'unico modo che posso pensare di fare questo è di fare un po 'di SQL personalizzato che include il conteggio in una colonna "virtuale" e fare l'ordinamento da questa colonna. Non sono sicuro che sia possibile.

Qualsiasi idea?

Sto usando Rails 3.0.3 e l'ultimo meta_search.

+0

sarebbe la mia scommessa migliore è quello di aggiungere solo una colonna db "current_inventory_records_count" per negozi che ho appena Assicurarsi che sia sempre corretto con before_save di ? – jfeust

risposta

8

Per aggiungere colonne in più per un insieme di risultati ...

In 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") 

Nel metodo index shops_controller.rb

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

In index.html.erb

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

Trovato il riferimento sort_by__asc qui: http://metautonomo.us/2010/11/21/metasearch-metawhere-and-rails-3-0-3/

+0

Perfetto, grazie! – jfeust

4

Rails ha una soluzione integrata per questo chiamato counter_cache

Creare una colonna tabella denominata "inventory_records_count" sulla vostra tavola negozi.

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

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

+0

Grazie, è bello sapere, ma voglio contare solo i record di inventario contrassegnati come "correnti". – jfeust

+0

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

+0

questo non funzionerà con un'associazione HABTM, sfortunatamente – CharlieMezak

Problemi correlati