2010-09-05 3 views
2

У меня есть таблица вроде:Rails, граф и группа

+--------+-----------+-------+-----------+ 
|house_no|house_alpha|flat_no|street_name| 
+--------+-----------+-------+-----------+ 
|  1|   |  |James St | 
|  1|   |  |James St | 
|  1|   |  |James St | 
|  2|   A|  |James St | 
|  2|   B|  |James St | 
|  3|   A|  |James St | 
|  4|   | 416|James St | 
|  4|   | 416|James St | 
+--------+-----------+-------+-----------+ 

И я пытаюсь подсчитать количество различных адресов в этой таблице. Это возвращает различные адреса:

Address.all(:select => 'street_name, flat_no, house_no, house_alpha', 
      :group => 'street_name, flat_no, house_no, house_alpha').length 

Но я хочу сделать это в конце SQL. и попытка совместить граф и группу мне не нравится. Я явно делаю что-то не так.

(База данных postgres, рельсы - 2.x).

+0

Вы имеете в виду, что 'Address.count (: группа => 'STREET_NAME, flat_no, house_no, house_alpha',: отчетливый => правда)' не работает? –

+0

нет. это не так. – robotdana

ответ

2

Я не уверен, что есть довольно Rails способ сделать подсчет по сгруппированным столбцам. В SQL существует множество странных способов сделать это, но этот путь достаточно прост, чтобы следовать.

Address.find(:all, 
      :select => "count(*) as addr_count", 
      :having => "addr_count > 0", 
      :group => 'street_name, flat_no, house_no, house_alpha').size 

Будет выполнен следующий SQL-запрос.

SELECT count(*) as addr_count FROM "addresses" GROUP BY street_name, flat_no, house_no, house_alpha HAVING addr_count > 0 

Edit: Прочитайте это для Postgres

Из комментариях ниже, вот способ сделать выше на Postgres.

Address.find(:all, 
      :select => "count(*)", 
      :having => "count(*) > 0", 
      :group => 'street_name, flat_no, house_no, house_alpha').size 

Это генерирует следующий запрос.

SELECT count(*) FROM "addresses" GROUP BY street_name, flat_no, house_no, house_alpha HAVING count(*) > 0 
+0

- это addr_count волшебная вещь? или мне нужно добавить столбец для этого? То, что вы написали, не работает. – robotdana

+0

addr_count - это просто псевдоним SQL, и ничего волшебного. Он не представляет собой столбец. Пожалуйста, опубликуйте свой вывод консоли и журналы, чтобы объяснить, что означает «не работает». – jdl

+0

Кроме того, у вашей таблицы есть столбец идентификатора? – jdl

5

Для рельсов 3 с Arel, вы можете сделать следующее:

Address.group(:street_name, :flat_no, :house_no, :house_alpha).having("count(*) > 0").count.size 
1

In Rails 2, я нашел вариант :group не ведут себя надежно (в моем последнем случае, он сделал массив из первой записи в каждой группе). В качестве альтернативы, вы можете объединить поиск дб с EnumerableArray#group_by следующим образом:

addresses = Address.find(:all, 
      :select => "count(*) as addr_count", 
      :having => "addr_count > 0"), 
grouped_addrs = addresses.group_by{|a| [a.street_name, a.flat_no, a.house_no, a.house_alpha] } 
Смежные вопросы