@proRuby

Страница 206 из 1594
Nikolay
25.09.2016
14:33:51
и выборку делать по ней

Denis
25.09.2016
14:34:57
так, спасибо, пойду гуглить про eager_load и полиморфные ассоциации

@feed = Article.approved + Image.approved + Video.approved @feed = @feed.sort_by { |obj| obj.created_at } вот простой вариант, но как впихнуть туда пагинацию блин..

Google
Nikolay
25.09.2016
14:47:57
пагинацию впихнуть легко, но тут ты кладешь в память все эти записи

https://github.com/amatsuda/kaminari#paginating-a-generic-array-object

Denis
25.09.2016
14:48:56
ну да, я про это и говорил) как выбрать только нужные записи в @feed = Article.approved + Image.approved + Video.approved непонятно

ща все работает вот с этим https://github.com/mislav/will_paginate/blob/master/lib/will_paginate/array.rb , но когда будет много записей будет печаль

ojab
25.09.2016
14:49:43
заведи ещё одну модельку Post has_one :article, :image, :video и работай с ней

Denis
25.09.2016
14:51:37
заведи ещё одну модельку Post has_one :article, :image, :video и работай с ней
потом нужно будет как-то выбирать допустим только Article с category_id: 1, если я сделаю Post, то не получится же так?

kolas
25.09.2016
14:52:31
получится через джойны

ojab
25.09.2016
14:53:25
Post.joins(:article).where(articles: { category_id: 1 })

Denis
25.09.2016
14:53:48
окей, большое спасибо всем, пойду дальше пытаться))

...
25.09.2016
14:56:05
Используй paginate_by_sql. sql = 'SELECT *, 'article' AS category FROM articles UNION ALL SELECT *, 'image' AS category FROM images UNION ALL SELECT *, 'video' AS category FROM videos ORDER BY "created_at" DESC' Feed.paginate_by_sql(sql, :page => @page, :per_page => @per_page) Где Feed будет AR::Base моделью без собственной таблицы. Замени * в селектах на поля которые тебе нужны, и опрелели в Feed эти поля через attr_accessor.

ojab
25.09.2016
14:57:56
печальный совет

Denis
25.09.2016
15:00:29
печальный совет
а почему печальный, не мог бы объяснить? а то он мне кажется самым простым)

Alex
25.09.2016
15:00:48
мне кажется feed должен быть реальным а не генерироваться на лету.

Google
ojab
25.09.2016
15:02:54
а почему печальный, не мог бы объяснить? а то он мне кажется самым простым)
ну если ты с результатом работать потом не планируешь, то ок. Тебе потенциально нужно созавать sql для каждой комбинации таблиц и непонятно как эти комбинации потом фильтровать. Если появится ещё одна таблица — будет ещё груснее. И это если не брать в расчёт производительность union.

Alex
25.09.2016
15:03:35
article, image, video

это все наверное стоит сделать STI?

Alex
25.09.2016
15:03:57
Тогда производительность будет лучше чем делать три выборки

и псевдоленту будет проще генерировать

Denis
25.09.2016
15:04:30
это все наверное стоит сделать STI?
STI же для таблиц с одинаковыми полями или я что-то не так понял?) У меня сейчас разные поля в каждой таблице

Alex
25.09.2016
15:04:38
Насколько сильно разные?

ojab
25.09.2016
15:04:49
sti просто будет оставлять ненужные поля пустыми

Alex
25.09.2016
15:04:52
Я так понимаю что это типо пикабушный сайт или подобный?

я когда нечто подобное делал решил что с STI оптимально.

Выборки получаются быстрые, а шаблонизатор сам разберется как каждый тип записи обработать

ojab
25.09.2016
15:05:35
и псевдоленту будет проще генерировать
И как будет выглядеть запрос для получения всех трёх типов с order by created_at?

Alex
25.09.2016
15:05:48
Post.fresh ?

и полагаться на created_at, ну ... не факт.

скорее published_at ?

Denis
25.09.2016
15:06:48
сейчас и есть published_at, я написал created_at для упрощения)

поля достаточно разные

сайт новостной (кусок говна какой-то) :D

Alex
25.09.2016
15:07:26
Насколько разные?

Google
Nikolay
25.09.2016
15:07:55
STI редко бывает оптимальным решением

Alex
25.09.2016
15:08:01
У тебя есть поле заголовок, описание, контент, автор_ид и дата_публикации полагаю. что то еще?

STI редко бывает оптимальным решением
Ну, выборки быстрые получаются. Псевдоленту на лету можно формировать

Да и у схожих сущностей многие поля схожие.

Nikolay
25.09.2016
15:08:35
ага, только потом ты станешь постепенно замечать, что твои модельки не такие уж и одинаковые

и начнется ад

Alex
25.09.2016
15:08:50
Это если задача не ясна.

А если тебе ясно как это будет выглядеть, то можно получить и плюсы.

Например если всех наследовать от Post, то можно делать state машины только для Post

Nikolay
25.09.2016
15:09:13
можно, но в исключительных ситуациях

Alex
25.09.2016
15:09:18
Например убрать пост в черновик и т.д

а как пост выглядит уже дело шаблонизатора

Alex
25.09.2016
15:09:39
Ну STI далеко не панацея, и далеко не везде удобен.

Но здесь, имхо конечно, зависит от задачи, должен прокатить.

Denis
25.09.2016
15:10:25
ладно, сейчас тогда попробую STI заюзать, попробовав как можно больше схожими сделать таблицы. Спасибо)

Alex
25.09.2016
15:10:50
ладно, сейчас тогда попробую STI заюзать, попробовав как можно больше схожими сделать таблицы. Спасибо)
От задачи зависит как выше сказали, с STI тоже можно обжечься. Но вроде должно прокатить.

Vitaliy
25.09.2016
16:01:09
Через полиморфные связи тоже неплохо может выйти. И

И это попроще в реализации, чем сейчас на уже созданных моделях городить STI, как мне кажется

Вот публикация видео/статьи/фотки - это что за операция? При одном раскладе - это изменение условного поля статус или state у видео/статьи/фотки, и апдейт published_at. Либо просто установка published_at текущей датой вместо nil.

При другом же раскладе мы можем хранить факт публикации в отдельной модели Publication. В ней оформляем полиморфную связь на ресурс, который публикуем. И операция публикации любого из трех ресурсов - это создание записи publication со ссылкой на этот ресурс

Google
Vitaliy
25.09.2016
16:04:21
Таким образом построение ленты сведется к Publication.all.order(created_at: :desc).page(params[:page])

А во вьюхе в цикле будем делать так: - publications.each do |publication| = render publication

Ошибка, рендер вот так: = render publication.resource

где resource - полиморфная ссылка на публикуемый ресурс

рельса должна сама определить при этом тип ресурса и отрендерить его в соответствующем паршиале (_video.slim, _picture.slim, _article.slim)

Alex
25.09.2016
16:38:25
Полиморфная связь это разве не несколько выборок сразу?

с STI выборка из одной таблицы идет

плюс расчет на то что многие поля одинаковые.

trickster
25.09.2016
16:39:00
кстати задавался уже вопросом

Admin
ERROR: S client not available

Vitaliy
25.09.2016
16:39:04
В данном случае выборка будет одна, из Publication

trickster
25.09.2016
16:39:08
насколько по производительности норм

полиморфная модель в этмо случае

Vitaliy
25.09.2016
16:39:15
а полиморфные ресурсы будут на eager_load

trickster
25.09.2016
16:39:20
там же будет джоин

Alex
25.09.2016
16:39:29
Vitaliy
25.09.2016
16:39:37
то есть кеширование

Alex
25.09.2016
16:39:47
Получить публикации, получить для каждого из них

Vitaliy
25.09.2016
16:39:47
для ленты это отлично

Alex
25.09.2016
16:39:55
то есть кеширование
Заткнуть проблему вместо решения, отлично.

Google
Alex
25.09.2016
16:40:07
Может сразу поставить 4 DB сервера? так же проще

Vitaliy
25.09.2016
16:40:20
пфф, ты хотел сказать - решить проблему?

http://blog.diatomenterprises.com/remove-n1-queries-in-your-ruby-on-rails-app/

ой не, это не то

Alex
25.09.2016
16:41:08
пфф, ты хотел сказать - решить проблему?
Ну решить проблему покупкой железа, да, или хаком.

Vitaliy
25.09.2016
16:41:09
недавно просто статья как раз в тему была, о панической нелюбви населения к N+1 запросам в рельсе

Alex
25.09.2016
16:41:27
Тут N+1 вообще непричем.

Vitaliy
25.09.2016
16:42:10
нуу, вообще то причем

https://rossta.net/blog/n+1-is-a-rails-feature.html

Вот она

...
25.09.2016
16:43:09
DHH рассказывает почему N+1 это фишка и почему turbolinks рулит https://www.youtube.com/watch?v=ktZLpjCanvg

kolas
25.09.2016
16:46:23
всего 4 запроса же, к общей коллекции и к релативным

Vitaliy
25.09.2016
16:48:17
больше

один запрос к publications на коллекцию, и кучка запросов к каждому resource при построении ленты

N+1, где N - количество публикаций на странице

kolas
25.09.2016
16:50:21
так надо includes сделать

Vitaliy
25.09.2016
16:51:16
Не надо

Igor
25.09.2016
16:51:24
+1 includes и inverse_of

Vitaliy
25.09.2016
16:51:32
Статья выше как раз об этом

Igor
25.09.2016
16:52:54
Вас в статье вот эта строчка не смущает? Post.all.order(published_at: :desc)

Vitaliy
25.09.2016
16:54:40
Не-а, и не должна смущать

Пагинацию поставить - не возбраняется

Страница 206 из 1594