2010-12-28 5 views
9

Ich verwende meta_search zum Sortieren von Spalten in einer Tabelle. Eine meiner Tabellenspalten ist eine Zählung der zugeordneten Datensätze für ein bestimmtes Modell.Rails meta_search gem: Sortieren nach Anzahl eines zugeordneten Modells

Im Grunde ist es das:

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 

in meinem Geschäft # Indexansicht Ich habe eine Tabelle, die für jedes Geschäft die current_inventory_count listet. Gibt es trotzdem eine Meta-Suche, um die Shops nach dieser Anzahl zu sortieren?

Ich kann meine current_inventory_count-Methode nicht verwenden, da meta_search nur benutzerdefinierte Methoden verwenden kann, die einen ActiveRecord :: Relation-Typ zurückgeben.

Der einzige Weg, über den ich darüber nachdenken kann, ist einige benutzerdefinierte SQL zu tun, die die Anzahl in einer "virtuellen" Spalte enthält und die Sortierung nach dieser Spalte. Ich bin mir nicht sicher, ob das überhaupt möglich ist.

Irgendwelche Ideen?

Ich verwende Rails 3.0.3 und die neueste Meta-Suche.

+0

würde meine beste Wette sein, nur eine „current_inventory_records_count“ db Spalte Shops hinzufügen, dass ich nur sicherstellen, ist immer richtig BEFORE_SAVE der Verwendung ? – jfeust

Antwort

8

Um zusätzliche Spalten zu einer Ergebnismenge hinzufügen ...

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

In shops_controller.rb Index-Methode

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

In index.html.erb

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

die sort_by__asc Referenz hier gefunden: http://metautonomo.us/2010/11/21/metasearch-metawhere-and-rails-3-0-3/

+0

Perfekt, danke! – jfeust

4

Rails hat eine integrierte Lösung für dieses genannt counter_cache

eine Tabellenspalte erstellen auf Ihrer Geschäfte Tabelle mit dem Namen „inventory_records_count“.

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

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

+0

Danke, das ist gut zu wissen, aber ich möchte nur die Inventory-Datensätze zählen, die als "aktuell" markiert sind. – jfeust

+0

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

+0

dies funktioniert nicht mit einer HABTM association, leider – CharlieMezak

Verwandte Themen