
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

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

Alex
25.09.2016
15:03:35
article, image, video
это все наверное стоит сделать STI?

Denis
25.09.2016
15:03:53

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

Denis
25.09.2016
15:04:30

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

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
У тебя есть поле заголовок, описание, контент, автор_ид и дата_публикации полагаю. что то еще?
Да и у схожих сущностей многие поля схожие.

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

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
Не-а, и не должна смущать
Пагинацию поставить - не возбраняется