Size: a a a

2020 July 23

VV

Vadim Venediktov in RubyRush
А чем ваш случай особенный?
источник

v.

viedit .com in RubyRush
тем что записей SocialVideos несколько десятков тысяч, у модели уже есть свои связи, social_videos достаточно редко будут прикрепляться к Offer а значит в колонке offer_id будет куча nil
источник

Э

Эдем in RubyRush
И чем это плохо?
источник

DM

Dmitriy Tensei Malys... in RubyRush
viedit .com
Добрый день. Вопрос больше по Rails, но также к теме правильной организации связей классов, может будут желающие посоветовать.
Есть модели Offer и SocialVideo
Нужна возможность к Offer прикреплять SocialVideo. Только для показа во вьюхе юзеру.
Как определиться с вариантом архитектуры из этих двух:
1. добавить колонку Offer.social_videos_ids и serialize :social_videos сохранит id-шники в yaml формате
потом забирать id-шники и находить нужные записи
2. сделать связь через модель Favorite
выступает в роли соединительной таблицы с полиморфными связями
favoritor_id, favoritor_type, favoritable_id, favoritable_type
изначально была для 'лайков'
тогда можно будет забирать как Offer.favorites
оба варианта прохладные какие то
источник

DM

Dmitriy Tensei Malys... in RubyRush
1 ваще сразу можно выкинуть, какой то костыль, 2 а тут проще сделать обычную has_many как выше предложили
источник

v.

viedit .com in RubyRush
есть сделаю колонку SocialVideo.offer_id и has_many связь, то невозможно будет одни и те же SocialVideos прикреплять к разным Offer. А это будет нужно. Значит опять возвращаемся к соединительной таблице?
источник

Э

Эдем in RubyRush
has many through
источник

v.

viedit .com in RubyRush
в моем случае through what ?
источник

Э

Эдем in RubyRush
OfferSocialVideo, например
источник

Э

Эдем in RubyRush
Это обычная связь many-to-many
источник

VV

Vadim Venediktov in RubyRush
viedit .com
есть сделаю колонку SocialVideo.offer_id и has_many связь, то невозможно будет одни и те же SocialVideos прикреплять к разным Offer. А это будет нужно. Значит опять возвращаемся к соединительной таблице?
Да, если одно видео можно цеплять к нескольким офферам, то offer_social_videos таблица с ключами offer_id, social_video_id
источник

VV

Vadim Venediktov in RubyRush
И связь, как Эдем написал
источник

v.

viedit .com in RubyRush
Vadim Venediktov
Про лайки не понял, какая связь
ну вот, значит возвращаемся к первоначальному
если у меня есть модель Favorite:
Favorite
favoritor_id, favoritor_type, favoritable_id, favoritable_type

имеет ли смысл не создавать отдельную таблицу offer_social_videos, a использовать существующую favorites ?
будут добавляться записи вида
favoritor_id: 1111, favoritor_type: 'Offer', favoritable_id: 2222, favoritable_type: 'SocialVideo'

и связи:
Offer
has_many :social_videos, through: favorite

SocialVideo
belongs_to :offer
источник

VV

Vadim Venediktov in RubyRush
Развивая вашу идею. Сделайте эту таблицу для связи вообще всех пар моделей, где нужна many-to-many связь :)
источник

v.

viedit .com in RubyRush
Сейчас в таблице favorites записи вида
favoritor_id: 1111, favoritor_type: 'User', favoritable_id: 2222, favoritable_type: 'SocialVideo'
favoritor_id: 3333, favoritor_type: 'User', favoritable_id: 4444, favoritable_type: 'Editor'
Это и имелось в виду, когда писал, что используется для 'лайков'
источник

VV

Vadim Venediktov in RubyRush
Ну я понял, вы на таблицах решили сэкономить
источник

VV

Vadim Venediktov in RubyRush
А зачем?
источник

Э

Эдем in RubyRush
Можно, вообще, всё в одной таблице делать и мутить JSON-колонки для связей
источник

Э

Эдем in RubyRush
(но не нужно)
источник

v.

viedit .com in RubyRush
Vadim Venediktov
Развивая вашу идею. Сделайте эту таблицу для связи вообще всех пар моделей, где нужна many-to-many связь :)
Ну вот я собственно и советуюсь чтоб понимать на сколько это хорошо или плохо с точки зрения других. На мой взгляд казалось достаточно логично иметь favorites для каких то моделей, к которым нужно присоединить другие many to many
источник