
Ракета
26.06.2017
18:05:43
ну в рельсе есть механизмы кеширования шаблонов
я не глубок в этой теме, но я бы двигался в этом направлении
при подобной проблеме
поиск можно сделать на стороне фронтенда

Google

Andiskiy
26.06.2017
18:06:18

v
26.06.2017
18:06:35
а чем поиск отличается от просто вывода?

Andiskiy
26.06.2017
18:07:11
Из-за канкан

Ракета
26.06.2017
18:08:32
так какая проблема то
если поиск на фронте
вываливай 3к записей но кешируй
в шаблонах рельсы

Andiskiy
26.06.2017
18:09:26
если поиск на фронте
Проблема при пагинации имел ввиду . За ответ спасибо, буду пробовать. Заказчик просто извращенец

Ракета
26.06.2017
18:09:47
ну я знаю на такие случае в рельсе и задуман стандартный cache в шаблонах
записи будут меняться. кеш сбросится
да первая загрузка будет долгая но потом будет мгновенная

Google

Nikita
26.06.2017
18:10:34
кстати да, товарищи
объясните, почему первая загрузка такая долгая?
а потом летает

Andiskiy
26.06.2017
18:11:03
Даже если одна запись поменяется, кэш сбросится и загрузка опять долгая ?

Ракета
26.06.2017
18:11:20
в теории да
)

Andiskiy
26.06.2017
18:11:41
А на практике?

Ракета
26.06.2017
18:12:12
на практике как настроишь
объясните, почему первая загрузка такая долгая?
вроде запросы на уровне базы данных кешируются, +загружается окружение рельсы
когда меняешь файл роутинга например, снова загрузка долгая
потому что все перезагружается в память
если не прав, поправьте)

Andiskiy
26.06.2017
18:14:16
t2.medium не слетит ?

Ракета
26.06.2017
18:15:28
ну я тебе говорю о кешировании на уровне вьюх
один раз запросив данные из бд потом юзер будет получать данные из файла
а у тебя еще и каждая из 3к записей
обращается в базу для проверки прав?
может ты мог бы оптимизировать запросы в базу + подключить кеширование
тогда перфоманс был бы бесконечно хорош

Google

Fedor
26.06.2017
18:46:13
вообще cancan - очень неприятная штука, когда дело косается множества записей
если надо вывести что-то достаточно кривое, вроде 3к записей с разными правамми и связями лучше написать руками один большой SQL запрос
это потенциально ускорит выборку на несколько порядков
самый простой способ убедиться, что все виснет на запросах к базе - просто попробовать дернуть метод, который возвращает коллекцию из консоли

Vasiliy
26.06.2017
18:53:41
Я так думаю жрется всё по памяти

Fedor
26.06.2017
18:54:46
врядли
даже если каждая запись по килобайту, 3к это всего 3 мегабайта )
ну даже если 30, все равно фигня
скорее всего классический n+1 запрос, умноженный на количество обращений к cancan

Andiskiy
26.06.2017
19:34:10
Просто каждую запись из 3k прогоняю через канкан, а там запрос идёт в бд, на проверку содержится ли такой юзер в другой таблице.

Fedor
26.06.2017
19:44:50
ну значит вместо n+1 у тебя 3N )

v
26.06.2017
20:03:00

Andiskiy
26.06.2017
21:35:46
Как будем обходить блокировку?

Sergey
26.06.2017
21:36:56
Просто каждую запись из 3k прогоняю через канкан, а там запрос идёт в бд, на проверку содержится ли такой юзер в другой таблице.
У юзера флаги роли храни
и для цепочки флагов делай запросы
если я тебя правильно понял. То есть допустим у юзера 2 роли, значит будет флаг_1 и флаг_2. В константе хранишь запрос: where flag_1=true and flag_2 =true

Andiskiy
26.06.2017
21:40:05
и для цепочки флагов делай запросы
Есть флаги. Я не с нуля его делал и в этом роде они как то странно сделали, если таблица юзеров и есть таблица логон, где все роли хранятся, логин пароль.

Sergey
26.06.2017
21:41:23
ну то есть для current_user ты можешь составить выборку, в которую попадут данные только для его уровня доступа/роли?

Google

Sergey
26.06.2017
21:41:31
без n+1?

Andiskiy
26.06.2017
21:56:35
Могу, я инклуд делаю. Плюс там не только для курент надо. Например, есть куррент и у него определённые уровни доступа, он может удалять других юзеров, если у куррент юзера роль позволяет, я в ability добавляю правило. Потом при переборе каждого из 3к юзера я проверяю можно ли его редактировать, редактировать можно всех, еси роль позволяет, если нет только себя, или вообще никого. и вторая проверка может ли быть он удалён, удаление зависит от того находится ли он в другой таблице. Там идёт запрос в другую таблицу Own на его существование в этой таблице. И тут если куррент юзер админ , то оно дико виснет, 70 сек грузится, если у него нет прав, соответственно роль ниже, 14 сек.

v
26.06.2017
21:57:49
я вот не понимаю
а нахрена все это при выводе?

Andiskiy
26.06.2017
21:59:07
Где это реализовать можно правильно ?
Проект уже большой и его просто так взять и поменять не получится

Sergey
26.06.2017
22:01:51
Ну тут можно как угодня развернутся и все такое. Я напишу самый простой пример тебе.

Andiskiy
26.06.2017
22:03:19

Admin
ERROR: S client not available

Sergey
26.06.2017
22:06:01
ага момент
class User < ActiveRecord::Base
CONST = {
'jedi' => 'where condition_1 and condition_2 and condition_3',
'padawan' => 'where condition_1 and condition_2',
'youngling' => 'where condition_1'
}
def get_abilit_query
[self.flag_1, self.flag_2, self.flag_3].map do |flag|
CONST[flag]
end.compact.join(' AND ')
end
end
вот тебе код для модели
ну логику думаю примерно понял. Сейчас для контроллера напишу
def index
query = current_user.get_abilit_query
my_search_query.where(query)
end
то, что у тебя сейчас находится в канкане, методы и условия выноси в константу
потом сможешь для текущего юзера сразу же построить запрос по условиям
ну а в контроллере просто подставляй этот полученные условия в общий запрос
если я тебя правильно понял, то это должно решить твою проблему

s
26.06.2017
22:17:14
а flag1, flag2, etc - это параметры запроса?
а, вижу, что да

Google

s
26.06.2017
22:18:10
я бы тут использовал has_scope или scopie

Sergey
26.06.2017
22:18:20
зачем гем?

s
26.06.2017
22:18:29
и написал бы нормальные скоупы
потому что проще поддерживать скоупы

Sergey
26.06.2017
22:18:37
ну я человеку примеры привел как сделать

s
26.06.2017
22:18:44
чем такое адовы строки
ну, в принципе, как пример

Sergey
26.06.2017
22:18:57
ну во первых
что такое скоуп?

s
26.06.2017
22:19:04
начальной точки эволюции фильтрации

Sergey
26.06.2017
22:19:05
он один фиг в строку превратится
я не знаю его исходных данных

s
26.06.2017
22:19:41
скоупы объединяются в чейны, их можно использовать из разных мест, в конечном итоге, их проще поддерживать

Sergey
26.06.2017
22:20:02
ну тут строку можно сразу в запрос подставить)
тоже самое получится не?)
в любом случае на усмотрение автора. Это все субъективно.
Главное пример наглядный)

Andiskiy
26.06.2017
22:22:20

Sergey
26.06.2017
22:22:53
Пожалуйста

Fedor
27.06.2017
07:14:17
как-то эта архитектруа знакомо пахнет )