Meilleure convention pour les données de base de données de plugins personnalisés pour 2021 ?

Je suis en train de créer un site qui est une communauté de location immobilière, dont les fonctionnalités principales sont centrées sur des discussions spécifiques à chaque ville. Il y aura des données utilisateur indiquant les villes qu’ils connaissent bien et leur relation avec ces villes (actuellement résident, y ont vécu, etc.), et les utilisateurs pourront également s’abonner aux villes dans lesquelles ils souhaitent investir mais qu’ils ne connaissent pas bien. Toutes les villes seront des catégories, avec un champ personnalisé pour stocker leurs données géocodées afin que les utilisateurs puissent parcourir les villes sur une carte.

Ce qui me fait hésiter, c’est la manière dont je devrais structurer cela d’un point de vue de l’efficacité de la base de données. Lorsque vous êtes sur une page de ville, j’afficherai un flux montrant les « experts membres » de cette ville. Si je dois interroger tous les utilisateurs et parcourir leurs champs personnalisés et le hash du champ personnalisé « villes d’expertise » à chaque fois que je rends une page de catégorie, je pense que ce serait assez lent, surtout à mesure que le nombre d’utilisateurs et de villes augmente.

Si je devais construire cela dans mon propre application Rails, ce problème serait facilement résolu avec des tables de jointure et des relations has_many_through ou quelque chose de similaire. Ce que je me demande ici, c’est quelle est l’approche recommandée pour un plugin qui nécessite une table de jointure. Il semble que les migrations et les tables personnalisées soient déconseillées et qu’il soit généralement préférable d’utiliser soit des champs personnalisés, soit PluginStore — je n’ai pas réussi à trouver de documentation réelle sur PluginStore, mais je suis actuellement en train de creuser.

J’ai pensé qu’il serait sage de demander l’approche « officiellement recommandée par Discourse » avant de m’engager trop loin dans une direction particulière.

Merci :slight_smile:
Zach

3 « J'aime »

Cela a peut-être été le cas dans les premiers temps, mais aujourd’hui, c’est tout le contraire. Nous avons même migré nos propres plugins des champs personnalisés vers leurs propres tables là où cela avait du sens, comme pour le plugin de sondage et le plugin de vote.

Les plugins disposant de modèles de données riches doivent créer leurs propres modèles, tables, relations et migrations. C’est beaucoup plus facile à maintenir et cela offre d’excellentes performances. Faites juste attention aux problèmes de type N+1 :wink:

5 « J'aime »

Ah, d’accord, fantastique. Je suis content de l’avoir demandé alors. :wink: Existe-t-il une méthode recommandée pour modifier les modèles principaux depuis mon plugin ?

Je souhaiterais ajouter quelques définitions et relations personnalisées, par exemple un hasmanythrough avec mes nouvelles tables, et je ne suis pas vraiment sûr de la meilleure façon de le faire, autre qu’en appelant des fonctions sur mon nouveau modèle où je dois passer les IDs de la catégorie et de l’utilisateur, etc.

J’ai trouvé ce post, mais il semble qu’il n’ait jamais reçu de réponse.

2 « J'aime »

Il y a quelques exemples dans le plugin Poll que j’ai mentionné ci-dessus :

2 « J'aime »

Super. Je suis vraiment excité que cela soit possible ! Merci.

3 « J'aime »