¿Cómo recuperar los propietarios del grupo? (Pregunta sobre código de Rails)

Creo que esta pregunta se adentra en los detalles de Rails, pero allá voy:

Estoy tratando de averiguar cómo mostrar al propietario o propietarios de cada grupo en la página de índice de grupos (equivalente a esta página).

Mi punto de partida es el modelo de grupo, lo que me sugiere que la característica de propietarios del grupo no está directamente adjunta a un grupo (a diferencia, por ejemplo, de “full_name”, que puedo ver que forma parte del esquema de grupo al final de ese enlace).

Por lo tanto, está claro que no puedo llamar a group.owners como puedo llamar a group.full_name. De manera similar, creo que tampoco puedo obtener la información de vuelta a través de la API al recuperar datos sobre un grupo, porque “owners” no parece ser uno de los valores devueltos.

¿Cómo podría obtener los propietarios de un grupo para mostrar esa información?

No tengo muy claro qué estás intentando lograr, pero creo que buscas GroupUser. Puedes obtener una lista de los group_ids y los user_ids de sus propietarios usando algo como:

GroupUser.where(owner: true).pluck("group_id", "user_id")
5 Me gusta

Gracias, esto es definitivamente un paso adelante. Mi objetivo es mostrar a los propietarios de un grupo debajo del nombre del grupo en la página de índice de grupos.

EDITO: Por ejemplo, algo como esto:

<script type="text/x-handlebars" data-template-name="components/groups-info">
 {{#if showFullName}}
  <span class="groups-info-name">{{group.full_name}}</span>
  {{#each group.group_users as |gUser|}}
      {{#if gUser.owner}}
            <div>{{gUser.user.name}}</div>
      {{/if}}
  {{/each}}
{{else}}
  <span class="groups-info-name">{{group.displayName}}</span>
{{/if}}
</script>

Esto no funciona del todo bien. ¿Qué falta?

1 me gusta

Necesitarás escribir un pequeño plugin para serializar la información correcta. Vi tu publicación en Marketplace. ¡Espero que alguien se anime a ayudarte!

Si quieres empezar a explorar seriamente los plugins, podrías considerar revisar Learn how to start building stuff for Discourse if you're newbie (like myself)

Armemos algo como una prueba de concepto muy básica que podría darte un punto de partida para que lo resuelvas por tu cuenta:

my-plugin/plugin.rb

# frozen_string_literal: true

# name: Group Test
# about: Group Test
# version: 0.1
# authors: Tester
# url: https://github.com/someone/something

enabled_site_setting :group_test_enabled

after_initialize do
  add_to_serializer(:basic_group, :owners) do
    GroupUser.where(group_id: object.id, owner: true).pluck("user_id")
  end
end

my-plugin/config/settings.yml

plugins:
  group_test_enabled:
    default: false
    client: true

En la pestaña <head> de un tema

<script type="text/x-handlebars" data-template-name="components/groups-info">
 {{#if showFullName}}
   <span class="groups-info-name">{{group.full_name}}</span>
 {{else}}
   <span class="groups-info-name">{{group.displayName}}</span>
   {{#each group.owners as |owner|}}
      {{#if owner}}
        <div>{{owner}}</div>
      {{/if}}
   {{/each}}
 {{/if}}
</script>

Si juntas todo eso y activas el plugin en la configuración de tu sitio, deberías ver los IDs de los propietarios del grupo listados en la página de grupos.

No podré ayudarte más allá de esto, ¡te deseo mucha suerte!

6 Me gusta

Esto es extremadamente útil, gracias. Entiendo que no puedes brindar más ayuda con el código, pero espero poder hacer dos preguntas generales que también podrían ser útiles para otros:

— ¿Podrías explicar brevemente por qué es necesario un serializador aquí? (Trato de entenderlo no solo para este caso, sino también para otras personalizaciones).

Y solo una pregunta rápida: ¿podría lograr esto directamente en mi panel de control? (Crear un plugin sería mucho más organizado, sin duda, pero como estoy en un plan alojado, no puedo importar nuevos plugins directamente; al menos requiere unos pasos adicionales).

1 me gusta

¡Claro! :slight_smile: Los datos no están expuestos de forma predeterminada en el BasicGroupSerializer. Solo incluimos lo que necesitamos.

Es un poco complicado de seguir, pero la única razón por la que el componente groups-info tiene lo que tiene disponible es porque recibe group de su plantilla padre:

Y la plantilla padre lo obtiene del controlador:

Me temo que no. ¡A menos que haya alguna magia de la que no tenga conocimiento!

2 Me gusta

Genial. Muchas gracias por esta información tan útil.

1 me gusta

Edición: movido aquí después de darme cuenta de que la pregunta que hice es más apropiada para un tema separado.

Hola @tshenry, estoy intentando configurar un plugin que incluye algo de código similar al que proporcionaste arriba para exponer al propietario del grupo. Tengo una duda que estoy aclarando:

–el modelo relevante aquí es “group” (al que se hace referencia en groups-info)
–pero en el serializer, no dices: add_to_serializer(:group, :owners)… En lugar de referenciar :group, haces referencia a :basic_group, así:

add_to_serializer(:basic_group, :owners)

¿Por qué haces referencia a basic_group en lugar de group en add_to_serializer?

Es porque ‘basic_group’ es el nombre del serializador en este caso: discourse/app/serializers/basic_group_serializer.rb at main · discourse/discourse · GitHub

3 Me gusta

¿Cómo identificaste que ese serializador era el correcto para este caso?

Esto es lo que he podido deducir: En el controlador de grupos, dentro de la acción index, existe una función (o método) llamada render_json_dump que incluye el BasicGroupSerializer en la llamada a serialize_data.

La página relevante para mostrar los datos de los grupos es el índice de grupos, por lo que la acción index del controlador es la correcta para examinar aquí.

¿Es así como sabes que el BasicGroupSerializer es el adecuado para referenciarlo aquí?

Si todo lo anterior es correcto, ¿se usaría el GroupShowSerializer para mostrar la página de detalles del grupo, dado que ese es el serializador referenciado en la acción show del controlador? (la página con los detalles de un grupo, aunque no parece existir una vista llamada “groups.show”).

¿Y qué sucede si no hay ningún serializador referenciado, como en la acción new del controlador?

Efectivamente, esa es la razón.

Porque eso no es un método GET. La serialización es para las grandes cantidades de datos repetitivos en el enlace descendente.

@JQ331, echa un vistazo al corazón de la configuración del enrutador aquí: discourse/config/routes.rb at main · discourse/discourse · GitHub

Esto te mostrará cómo se conectan todas las rutas y los métodos de los controladores en la aplicación base.

También considera leer esto: Rails Routing from the Outside In — Ruby on Rails Guides

Un detalle adicional a tener en cuenta, que es realmente confuso y me confundió mucho al principio: Rails es un framework y utiliza convenciones de nomenclatura muy estrictas para lograr sus efectos mágicos. No es obvio de inmediato, si no estás acostumbrado, cómo se conectan todas las cosas, pero si tienes en cuenta las convenciones de nomenclatura, todo empieza a tener más sentido.

1 me gusta

Gracias por esa referencia, es muy útil. Encuentro el archivo de rutas un poco confuso. Por ejemplo, por lo que puedo ver, no hay ninguna acción de controlador groups#index referenciada, aunque claramente es la acción relevante para la página principal de grupos. Sin embargo, sí veo la acción groups#index cuando ejecuto:
% rails routes, lo que supongo que también es una forma útil de ver cómo corresponde una página determinada a un controlador.

No te saltes la documentación :wink:

Así es como funciona:
discourse/config/routes.rb at 57a8b3b964f867818c4dbfe394b762c0a286c28d · discourse/discourse · GitHub

Consulta: Rails Routing from the Outside In — Ruby on Rails Guides

Esta es una forma muy concisa de enrutar muchos métodos.

3 Me gusta