2010-12-28 9 views
9

Używam meta_search do sortowania kolumn w tabeli. Jedną z kolumn tabeli jest liczba powiązanych rekordów dla konkretnego modelu.Railsy gem meta_search: sortowanie według liczby powiązanych modeli

W zasadzie to tak:

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 

w moim sklepie widoku indeksu # Mam tabeli z listą zewnątrz current_inventory_count dla każdego sklepu. Czy mimo to używać meta_search do zamawiania sklepów według tej liczby?

Nie mogę użyć mojej metody current_inventory_count, ponieważ meta_search może używać tylko niestandardowych metod zwracających typ ActiveRecord :: Relation.

Jedyny sposób, w jaki mogę to zrobić, to wykonanie niestandardowego kodu SQL, który zawiera liczbę w kolumnie "wirtualnej" i sortowanie według tej kolumny. Nie jestem pewien, czy to nawet możliwe.

Jakieś pomysły?

Używam Rails 3.0.3 i najnowszego meta_search.

+0

będzie moja najlepiej być po prostu dodać „current_inventory_records_count” kolumny db Shops że tylko upewnić się, jest zawsze prawidłowa użyciu before_save-tych ? – jfeust

Odpowiedz

8

Aby dodać dodatkowe kolumny do zestawu wyników ...

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

W metodzie indeksu shops_controller.rb

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

W index.html.erb

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

Znalezione odniesienie sort_by__asc tutaj: http://metautonomo.us/2010/11/21/metasearch-metawhere-and-rails-3-0-3/

+0

Doskonale, dziękuję! – jfeust

4

Rails ma wbudowany w rozwiązanie tego zwanej counter_cache

Utwórz kolumnę tabeli o nazwie „inventory_records_count” na stole sklepów.

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

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

+0

Dzięki, to dobrze wiedzieć, ale chcę liczyć tylko rekordy zapasów, które są oznaczone jako "aktualne". – jfeust

+0

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

+0

to nie zadziała ze stowarzyszeniem HABTM, niestety – CharlieMezak

Powiązane problemy