@rubylang

Страница 1086 из 1684
Ракета
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 )

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
Ну тут можно как угодня развернутся и все такое. Я напишу самый простой пример тебе.

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
как-то эта архитектруа знакомо пахнет )

Страница 1086 из 1684