2014-02-10 4 views
0

У меня есть массив @products. Каждый элемент массива является хешем, содержащим несколько полей (но не всех) из таблицы Product и соответствующих значений.RoR: Как отсортировать массив с помощью областей

У меня есть область descend_by_popularity в Product, что позволяет сортировать товары на основе popularity. Я хотел бы отсортировать массив @products, используя эту область.

Что я пробовал:

@product_group = Array.new 
@products.each do |product| 
    @product_group.push(Product.find(product['id'])) 
end 
@product_group1 = @product_group.descend_by_popularity 

Но это дает мне ошибку:

undefined method `descend_by_popularity' for #<Array:0xb2497200> 

Я также хочу, чтобы изменить отсортированный список Product обратно в формат @products массива.

Благодаря

ответ

1

Прицелы имеют смысл только в контексте ActiveRecord для запросов к базе данных (так как она используется для изменения запроса SQL). То, что вы сделали, - это выбросить в массив множество продуктов. Этот массив больше ничего не знает о области. При создании объекта @products вам придется использовать область действия. (И это, кажется, не делает много смысла, чтобы переместить результат запроса в массив)

Так что-то вроде

@products = Product.descend_by_popularity.where(some more stuff) 

должны работать для вас. После этого вы должны иметь записи в порядке, определенном областью действия, и затем можете либо использовать их напрямую, либо по-прежнему вставлять их в массив, если это то, что вы хотите сделать.

С обновленной информации от комментариев она выглядит как, может быть, лучший способ пойти бы первым собрать только идентификаторы продукта из ответа Solr в массив, а затем запустить, что в поиске вместе с вашей сферы:

@product_group = @products.map{|product| product.id} 
@result = Product.where(id: @product_group).descend_by_popularity 

Это должно технически работать, peformance - это другой вопрос. Я бы подумал об объединении этих данных в документ Solr, если он не меняется слишком часто.

Теперь если вы заинтересованы только в порядке продуктов, как, например, вы могли бы сделать что-то вроде этого, чтобы получить @products в таком порядке:

@result.map{|r| @products.find{|p| p[:id] == r.id} 

хотя это может замедлить вещи немного.

+0

Я Извлечение '@' продуктов массив из 'solr'. Таким образом, его невозможно изменить. – nish

+0

Затем вы должны либо использовать Solr для сортировки (быстрее или в любом случае), либо вручную сортировать. Как выглядит этот объем? Если это только одно или два поля, вы можете использовать сортировку Array # (в зависимости от того, насколько большой этот массив может получить это может или не может работать.) –

+0

Невозможно добавить поле в solr.Сфера является 'лямбда { { : присоединяется =>: мастер, : заказ =><< SQL COALESCE (( ВЫБОР COUNT (line_items.id) ОТ line_items РЕГИСТРИРУЙТЕСЬ варианты, как popular_variants НА popular_variants.id = line_items.variant_id ГДЕ popular_variants.product_id = products.id ), 0) DESC SQL- } } ' – nish

0

Попробуйте это: find_by_id, как Params

@product_group = Array.new 

@products.each do |product| 
    @product_group.push(Product.find(params['id'])) 
end 

и возвращает массив @product_group

@product_group1 = @product_group.descend_by_popularity 
+0

Это не сработает. params ['id'] не будет. не может найти «Продукт» без идентификатора – nish

+0

, что находится в ваших параметрах? Это ваш код уровня или уровня вашего контроллера.? – Dheer

+0

ничего не связано с 'продуктом'. :) – nish

Смежные вопросы