Рельсы, граф и группа - PullRequest
       5

Рельсы, граф и группа

3 голосов
/ 06 сентября 2010

У меня есть таблица типа:

 +--------+-----------+-------+-----------+
 |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, rails 2.x).

Ответы [ 3 ]

6 голосов
/ 04 февраля 2012

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

Address.group(:street_name, :flat_no, :house_no, :house_alpha).having("count(*) > 0").count.size
2 голосов
/ 06 сентября 2010

Я не уверен, что есть симпатичный 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

Редактировать: Прочтите это для 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
1 голос
/ 29 октября 2013

В 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] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...