Как разбить набор данных activerecord на две половины, используя один запрос с RAILS 2.3.x? - PullRequest
0 голосов
/ 02 ноября 2010

Набор данных выглядит следующим образом (Модель WF с идентификатором, widget_id, feature_id, status в виде полей)

id widget_id feature_id status


1 1 23 1

2 1 45 1

3 1 89 1

4 2 41 1

5 1 10 0

6 1 90 0

7 1 83 0

8 2 45 1

Каким может быть мой запрос activerecord, который позволяет мне записать одно утверждение, а результат группируется в нечто подобное (фильтр на основе состояния)

a, b = [23,45,89,41,45] [10,90,83]

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

Если вы хотите сделать это только с одним SQL-запросом, используйте group_by :

all_grouped = WF.all(:select => 'feature_id, status').group_by(&:status)

Это вернет вам OrderedHash с двумя парами ключ / значение (при условии, что статус либо0 или 1).Ключом каждой пары будет статус, а значением будет массив экземпляров WF, имеющих этот статус.

Вы можете дополнительно манипулировать возвращаемым OrderedHash , используя любой Enumerable метод (например, sort, sort_by, map и т. д.)

Чтобы получить вывод, который вы хотите в качестве a, b, вам необходимо добавить следующие строки:

a = all_grouped.select{ |k, v| k == 1 }[0].last.map(&:feature_id) # select WFs with status == 1 and keep only the feature attribute
b = all_grouped.select{ |k, v| k == 0 }[1].last.map(&:feature_id) # same with status == 0
0 голосов
/ 02 ноября 2010

Это далеко не элегантно, но чтобы удовлетворить ваши требования, вы можете сделать что-то вроде этого:

#model
class WF < ActiveRecord::Base

   def self.id_group_on_status
      a = WF.find_all_by_status(1).map(&:id)
      b = WF.find_all_by_status(0).map(&:id)
      a,b
   end
end

#somewhere else
a,b = WF.id_group_on_status
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...