Como recuperar os proprietários do grupo? (Pergunta sobre código Rails)

Acho que essa questão entra em detalhes do Rails, mas vamos lá:

Estou tentando descobrir como exibir o proprietário ou os proprietários de cada grupo na página de índice de grupos (equivalente a esta página).

Meu ponto de partida é o modelo de grupo, que me sugere que a característica de proprietários do grupo não está diretamente associada ao grupo (ao contrário, digamos, de “full_name”, que vejo fazer parte do esquema do grupo no final desse link).

Portanto, está claro que não posso chamar group.owners como posso chamar group.full_name. Da mesma forma, não acho que consiga obter essas informações de volta pela API ao recuperar dados sobre um grupo, pois “owners” não parece ser um dos valores retornados.

Como eu poderia obter os proprietários de um grupo para exibir essas informações?

Não estou totalmente claro sobre o que você está tentando alcançar, mas acho que você está procurando por GroupUser. Você pode obter uma lista de group_ids e os user_ids dos seus proprietários usando algo como:

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

Obrigado, isso é definitivamente um passo à frente. Meu objetivo é exibir os proprietários de um grupo abaixo do nome do grupo na página de índice de grupos.

EDIT: Por exemplo, algo assim:

<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>

Isso não funciona exatamente como deveria. O que está faltando?

Você precisará escrever um pequeno plugin para serializar as informações corretas. Vi sua postagem no Marketplace. Espero que alguém se interesse pela sua ideia!

Se quiser começar a explorar seriamente plugins, talvez valha a pena conferir Learn how to start building stuff for Discourse if you're newbie (like myself)

Montei algo como uma prova de conceito super básica que pode te dar um ponto de partida para descobrir como fazer isso por conta própria:

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

Na aba <head> de um 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>

Se você juntar tudo isso e ativar o plugin nas configurações do seu site, deverá ver os IDs dos usuários proprietários dos grupos listados na página de grupos.

Não poderei ajudar além disso, então boa sorte!

Isso é extremamente útil—obrigado. Entendo que você não possa fornecer mais ajuda com código, mas espero poder fazer duas perguntas gerais que também podem ser úteis para outras pessoas:

–Você pode explicar brevemente por que um serializador é necessário aqui? (estou tentando entender não só para este caso, mas também para outras personalizações)

E só uma pergunta rápida—seria possível fazer isso apenas no meu painel? (criar um plugin seria certamente mais organizado, mas como estou em um plano hospedado, não consigo importar novos plugins diretamente—pelo menos exigiria alguns passos a mais)

Claro :slight_smile: Os dados não são expostos por padrão no BasicGroupSerializer. Incluímos apenas o que é necessário.

É um pouco confuso de seguir, mas a única razão pela qual o componente groups-info tem o que tem disponível é porque ele recebe group de seu template pai:

E o template pai o recebe do controlador:

Temor que não. A menos que exista alguma mágica da qual eu não tenha conhecimento!

Legal. Muito obrigado por essas informações úteis.

Edição: movido para cá após perceber que a pergunta que fiz é mais adequada para um tópico separado.

Olá @tshenry, estou tentando configurar um plugin que inclui algum código semelhante ao que você forneceu acima para expor o proprietário do grupo. Tenho uma dúvida sobre isso:

–o modelo relevante aqui é “group” (referenciado pelo groups-info)
–mas no serializer, você não diz: add_to_serializer(:group, :owners)… Em vez de referenciar :group, você referencia :basic_group, assim:

add_to_serializer(:basic_group, :owners)

Por que você referencia basic_group, em vez de group, no add_to_serializer?

É porque ‘basic_group’ é o nome do serializer neste caso: discourse/app/serializers/basic_group_serializer.rb at main · discourse/discourse · GitHub

Como você identificou que esse serializador era o adequado para este caso?

Isso é o que consegui reunir: no controlador de grupos, na ação index, há uma função (ou método) render_json_dump que inclui o BasicGroupSerializer na chamada serialize_data.

A página relevante para exibir os dados dos grupos é o índice de grupos, então a ação index no controlador é a correta para analisar aqui.

Foi assim que você soube que o BasicGroupSerializer era o correto para referenciar aqui?

Se tudo isso estiver correto, o GroupShowSerializer seria usado para exibir a página de visualização do grupo, já que é o serializador referenciado na ação show do controlador? (a página com os detalhes de um grupo — embora não pareça haver uma visualização “groups.show”).

E então, o que acontece se não houver nenhum serializador referenciado, como na ação new do controlador?

Essa é de fato a razão.

Porque isso não é um método GET. A serialização é para as grandes quantidades de dados repetitivos no downlink.

@JQ331, dê uma olhada no coração da configuração do roteador aqui: discourse/config/routes.rb at main · discourse/discourse · GitHub

Isso mostrará como todas as rotas e métodos do controlador estão conectados na aplicação base.

Considere também ler: Rails Routing from the Outside In — Ruby on Rails Guides

Mais uma coisa a notar, que é realmente confusa e me confundiu bastante no início: Rails é um framework e usa convenções de nomenclatura muito rígidas para fazer parte de sua mágica funcionar. Não fica imediatamente claro, quando você não está acostumado, como tudo é conectado, mas ao levar em conta as convenções de nomenclatura, tudo começa a ficar mais claro.

Obrigado por essa referência—muito útil. Achei o arquivo de rotas um pouco confuso. Por exemplo, pelo que consigo ver, não há nenhuma ação de controlador groups#index referenciada, mesmo sendo claramente a ação relevante para a página principal de grupos. No entanto, vejo a ação groups#index quando executo:
% rails routes, o que, imagino, também é uma maneira útil de ver como uma página específica corresponde a um controlador.

Não pule a documentação :wink:

É assim que funciona:
discourse/config/routes.rb at 57a8b3b964f867818c4dbfe394b762c0a286c28d · discourse/discourse · GitHub

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

Essa é uma maneira muito concisa de rotear muitos métodos.