Size: a a a

Чат по руби

2021 February 05

VN

Vyacheslav Nepomnyas... in Чат по руби
pull request сделай 🙂
источник

A

Alex in Чат по руби
мне нужно его в ветку оригинального
источник

И

Иван in Чат по руби
Alex
мне нужно его в ветку оригинального
источник

GG

Gleb Grishakov in Чат по руби
Гайз, привет)
А кто силен в SQL, подскажите плиз, как боролись с такой проблемой:

```
ActiveRecord::StatementInvalid (PG::InvalidColumnReference: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list)
```

Запрос такой: есть участник соревнований - entry. Нам надо найти десятерых последних за него проголосовавших.
То есть: берется участник (entry), ищем его голоса(votes), сортируем по DESC (более поздние), берем у этих голосов айдишники юзеров (уникальные) и потом находим по айдишникам юзеров.
На рельсе это выглядит так:

```
user_ids = @entry.votes.order({ created_at: :desc }).map(&:user_id).uniq.take(10)
```

Проблема тут в том, что мы мапим всех, кто проголосовал, а их может быть много. Нам надо десять.
Вот эта штука сработает, но выжрет памяти, тк мы вытаскиваем всех проголосовавших.
Я пробовал такой вариант:

```
@entry.votes.order('created_at DESC').select(:user_id).distinct
```

Но постгрес так не умеет. Может, кто сталкивался?
источник

И

Иван in Чат по руби
Gleb Grishakov
Гайз, привет)
А кто силен в SQL, подскажите плиз, как боролись с такой проблемой:

```
ActiveRecord::StatementInvalid (PG::InvalidColumnReference: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list)
```

Запрос такой: есть участник соревнований - entry. Нам надо найти десятерых последних за него проголосовавших.
То есть: берется участник (entry), ищем его голоса(votes), сортируем по DESC (более поздние), берем у этих голосов айдишники юзеров (уникальные) и потом находим по айдишникам юзеров.
На рельсе это выглядит так:

```
user_ids = @entry.votes.order({ created_at: :desc }).map(&:user_id).uniq.take(10)
```

Проблема тут в том, что мы мапим всех, кто проголосовал, а их может быть много. Нам надо десять.
Вот эта штука сработает, но выжрет памяти, тк мы вытаскиваем всех проголосовавших.
Я пробовал такой вариант:

```
@entry.votes.order('created_at DESC').select(:user_id).distinct
```

Но постгрес так не умеет. Может, кто сталкивался?
Сделай limit 10 вместо take 10
источник

P

Paul in Чат по руби
не
источник

P

Paul in Чат по руби
это не сработает
источник

P

Paul in Чат по руби
или они всегда разные?
источник

P

Paul in Чат по руби
тогда
user_ids = @entry.votes.order({ created_at: :desc }).limit(10).pluck(:user_id).uniq
источник

P

Paul in Чат по руби
Глеб, у тебя только по одному голосу на entry от каждого юзера?
источник

GG

Gleb Grishakov in Чат по руби
Может  быть много голосов. Штука в том, что если мы сделаем вот так:

user_ids = @entry.votes.order({ created_at: :desc }).limit(10).pluck(:user_id).uniq

Он обрубит последние десять голосов, но там может оказаться один и тот же юзер и pluck уже даст не десятерых, а например восьмерых)
источник

P

Paul in Чат по руби
Gleb Grishakov
Может  быть много голосов. Штука в том, что если мы сделаем вот так:

user_ids = @entry.votes.order({ created_at: :desc }).limit(10).pluck(:user_id).uniq

Он обрубит последние десять голосов, но там может оказаться один и тот же юзер и pluck уже даст не десятерых, а например восьмерых)
ну вот об этом я и подумал, поэтому не стал выкладывать то решение
источник

GG

Gleb Grishakov in Чат по руби
Нам именно надо найти последние десять проголосовавших юзеров
источник

P

Paul in Чат по руби
угу
источник

P

Paul in Чат по руби
давай так
источник

P

Paul in Чат по руби
@entry.votes.select(:date, :user_id).order('date DESC')
источник

P

Paul in Чат по руби
не. надо уникальных выбрать
источник

GG

Gleb Grishakov in Чат по руби
Ога, одинаковые залетают
источник

P

Paul in Чат по руби
@entry.votes.distinct.select(:date, :user_id).order('date DESC')
источник

P

Paul in Чат по руби
а так?
источник