Rails meta_search gem: сортировка по количеству ассоциированной модели - PullRequest
9 голосов
/ 28 декабря 2010

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

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

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

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

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

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

Есть идеи?

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

Ответы [ 2 ]

8 голосов
/ 23 апреля 2011

Чтобы добавить дополнительные столбцы в набор результатов ...

В 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/

4 голосов
/ 16 марта 2011

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

...