Comando Rails para promover em massa usuários ao TL2?

Olá, estou abrindo um novo tópico sobre isso, pois acredito que minhas perguntas em um tópico anterior sobre o assunto foram ignoradas, já que originalmente o marquei como resolvido, mas não está.

Caso: Migrei para o Discourse, e os membros do fórum antigo têm todos o nível TL1, o que eles consideram injusto. Então, eu gostaria de promovê-los todos ao TL2 alterando os requisitos. Muitos deles estão inativos porque precisei desativar as contas antes da migração.

Mudei os requisitos do TL2 para basearem-se apenas na contagem de postagens e dias de visita para 0.

Após 10 dias, apenas alguns usuários foram promovidos, então parece que as pessoas precisam fazer login ou responder a uma postagem para que a verificação do TL2 ocorra. (Ainda não descobri qual das duas é a condição necessária).

Gostaria muito de poder conceder a todos os antigos membros do meu fórum o status TL2. Existe alguma maneira de executar um comando em algum lugar para fazer isso? Algo como percorrer todos os usuários e promovê-los se atenderem aos novos critérios do TL2.

Muito obrigado antecipadamente pela sua ajuda e insights! :slight_smile:

2 curtidas

Talvez:

users = User.where('admin = false')
users.update_all(trust_level: 2)
1 curtida

Essa consulta também alterará todos os moderadores para o nível de confiança 2.

Não tenho certeza se @Queth realmente deseja fazer isso.

3 curtidas

Há um tutorial sobre como mover em massa todos os usuários de um nível de confiança inferior para um nível superior (e vice-versa):

8 curtidas

Muito obrigado pelas respostas rápidas!

@Canapin, @neounix

Não me importo de mudar os mods para tl2 temporariamente; acho que posso definir o TL deles manualmente depois. Acredito que isso não afetaria as habilidades dos mods? Afetaria?

@dax

Obrigado! Estamos falando de 20 mil usuários: 10 mil são tl1 após a migração e os outros 10 mil são 0. Eu gostaria de promover apenas os tl1, e consigo fazer isso com essa consulta, certo?

User.exec_sql("UPDATE users SET trust_level = 2 WHERE trust_level IN ( 1)")

Outro ponto é que, nesse meio tempo, houve inscrições de novos membros “reais” que eu não quero promover para TL2 sem que eles tenham conquistado isso :wink:
Haveria uma maneira de incluir algum critério de data de registro? Por exemplo, todos os TL1 que se registraram antes de 17 de março de 2020?

2 curtidas

Sim, @Queth. Você gostaria que eu publicasse uma cópia da estrutura da tabela de usuários para que você possa ver todas as entradas diferentes?

Atualização: Aqui está, @Queth… você pode ver, pela descrição da tabela, que você tem muitas opções :slight_smile:

tabela de usuários
discourse=# \d users

                                                Table "public.users"
          Column           |            Type             | Collation | Nullable |              Default              
---------------------------+-----------------------------+-----------+----------+-----------------------------------
 id                        | integer                     |           | not null | nextval('users_id_seq'::regclass)
 username                  | character varying(60)       |           | not null | 
 created_at                | timestamp without time zone |           | not null | 
 updated_at                | timestamp without time zone |           | not null | 
 name                      | character varying           |           |          | 
 seen_notification_id      | integer                     |           | not null | 0
 last_posted_at            | timestamp without time zone |           |          | 
 password_hash             | character varying(64)       |           |          | 
 salt                      | character varying(32)       |           |          | 
 active                    | boolean                     |           | not null | false
 username_lower            | character varying(60)       |           | not null | 
 last_seen_at              | timestamp without time zone |           |          | 
 admin                     | boolean                     |           | not null | false
 last_emailed_at           | timestamp without time zone |           |          | 
 trust_level               | integer                     |           | not null | 
 approved                  | boolean                     |           | not null | false
 approved_by_id            | integer                     |           |          | 
 approved_at               | timestamp without time zone |           |          | 
 previous_visit_at         | timestamp without time zone |           |          | 
 suspended_at              | timestamp without time zone |           |          | 
 suspended_till            | timestamp without time zone |           |          | 
 date_of_birth             | date                        |           |          | 
 views                     | integer                     |           | not null | 0
 flag_level                | integer                     |           | not null | 0
 ip_address                | inet                        |           |          | 
 moderator                 | boolean                     |           |          | false
 title                     | character varying           |           |          | 
 uploaded_avatar_id        | integer                     |           |          | 
 locale                    | character varying(10)       |           |          | 
 primary_group_id          | integer                     |           |          | 
 registration_ip_address   | inet                        |           |          | 
 staged                    | boolean                     |           | not null | false
 first_seen_at             | timestamp without time zone |           |          | 
 silenced_till             | timestamp without time zone |           |          | 
 group_locked_trust_level  | integer                     |           |          | 
 manual_locked_trust_level | integer                     |           |          | 
 secure_identifier         | character varying           |           |          | 
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "index_users_on_secure_identifier" UNIQUE, btree (secure_identifier)
    "index_users_on_username" UNIQUE, btree (username)
    "index_users_on_username_lower" UNIQUE, btree (username_lower)
    "idx_users_admin" btree (id) WHERE admin
    "idx_users_moderator" btree (id) WHERE moderator
    "index_users_on_last_posted_at" btree (last_posted_at)
    "index_users_on_last_seen_at" btree (last_seen_at)
    "index_users_on_uploaded_avatar_id" btree (uploaded_avatar_id)
Referenced by:
    TABLE "user_security_keys" CONSTRAINT "fk_rails_90999b0454" FOREIGN KEY (user_id) REFERENCES users(id)
    TABLE "poll_votes" CONSTRAINT "fk_rails_b64de9b025" FOREIGN KEY (user_id) REFERENCES users(id)
    TABLE "bookmarks" CONSTRAINT "fk_rails_c1ff6fa4ac" FOREIGN KEY (user_id) REFERENCES users(id)

Sempre é uma boa ideia fazer um SELECT primeiro e ter certeza de que você está satisfeito com sua consulta antes de fazer um UPDATE :slight_smile: e sempre faça um backup completo antes de começar a mexer em alterações em massa no banco de dados. Erros de digitação acontecem até mesmo com os melhores dos melhores. Uma das principais diferenças entre um especialista e um iniciante é que o especialista sempre faz um backup primeiro :slight_smile:

3 curtidas

Obrigado @neounix!

Seria possível me ajudar com a consulta correta? Porque não sei como fazer isso… provavelmente incluir em algum lugar

Where user created at < [17 de março de 2020, mas então formatado corretamente]
1 curtida

Eu adoraria ajudar; mas algumas coisas são mais fáceis (e melhores) quando você mesmo faz um pouco do seu trabalho de casa. Você tem todas as peças do quebra-cabeça, então meu conselho é dedicar um tempo e aprender a escrever uma consulta SQL. Honestamente, isso é apenas o básico de SQL para PostgreSQL, algo que pode ser encontrado em inúmeros tutoriais online.

Não é “minha praia” repetir coisas do tipo “tutoriais básicos” sobre informações que outros podem facilmente encontrar fazendo sua própria pesquisa no Google. Isso é apenas eu. Obrigado pela compreensão e, por favor, perdoe minha honestidade.

Nota: SQL existe desde 1974, ou seja, há 46 anos. É bom ter conhecimentos básicos de SQL se você vai administrar um aplicativo baseado em banco de dados.

3 curtidas

Obrigado :slight_smile:
Bem, eu tenho um conhecimento básico, mas escrever consultas do zero ainda é algo que eu prefiro copiar e colar de uma fonte confiável, em vez de tentar criar a minha própria.

Mas obrigado mesmo pelos blocos de construção!

2 curtidas

Sempre é uma boa ideia fazer um SELECT primeiro e ter certeza de que você está satisfeito com sua consulta antes de fazer um UPDATE :slight_smile:, e sempre faça um backup completo antes de começar a mexer em mudanças em massa no banco de dados.

3 curtidas