2010-12-28 10 views
9

Estoy usando meta_search para ordenar columnas en una tabla. Una de las columnas de mi tabla es un recuento de los registros asociados para un modelo en particular.Rails meta_search gem: ordena por recuento de un modelo asociado

Básicamente se trata de esto:

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 

En mi tienda de la vista de índice # Tengo una tabla que muestra el current_inventory_count para cada tienda. ¿Hay alguna forma de usar meta_search para ordenar las tiendas según este conteo?

No puedo usar mi método current_inventory_count porque meta_search solo puede usar métodos personalizados que devuelven un tipo de relación ActiveRecord ::.

La única manera en que puedo pensar en hacer esto es hacer un SQL personalizado que incluya el recuento en una columna "virtual" y hacer la ordenación por esta columna. No estoy seguro de si eso es posible.

¿Alguna idea?

Estoy usando Rails 3.0.3 y la última meta_search.

+0

sería mi mejor apuesta es simplemente agregar una columna DB "current_inventory_records_count" a tiendas que sólo asegúrese siempre es correcta utilizando de before_save ? – jfeust

Respuesta

8

Para añadir columnas adicionales a un conjunto de resultados ...

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

En método del índice shops_controller.rb

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

En index.html.erb

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

encontrado la referencia sort_by__asc aquí: http://metautonomo.us/2010/11/21/metasearch-metawhere-and-rails-3-0-3/

+0

Perfecto, gracias! – jfeust

4

Rails tiene una solución integrada para esta llamada counter_cache

Crear una columna de tabla llamada "inventory_records_count" en su mesa de tiendas.

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

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

+0

Gracias, eso es bueno saber, pero quiero contar solo los registros de inventario marcados como "actuales". – jfeust

+0

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

+0

esto no funcionará con una asociación HABTM, desafortunadamente – CharlieMezak

Cuestiones relacionadas