Comandos do console Rails

Encontrei o console do Rails e descobri que você pode fazer mágica negra como:\n\n```
DB.exec(<<~SQL)
UPDATE topics
SET title = ‘psql redo!’
WHERE id = 886
SQL


Como descubro quais comandos/funções podem ser executados no console? Como aprendo mais sobre essa bruxaria?\n\nNota: se ainda não ficou óbvio, não sei nada sobre Ruby ou Rails.
1 curtida

Você realmente precisa aprender sobre Rails e não modificar diretamente esse banco de dados. O que eu fiz foi encontrar um livro sobre Rails e lê-lo. E em algum momento também olhei um livro de Ruby. Sou velho o suficiente para lembrar quando livros eram a única maneira de aprender sobre computadores. Pelo que entendi, existem muitos sites na internet que podem te dar um tutorial de Rails. Acho que existe uma maneira de pesquisar na internet para encontrá-los.

Aqui está um que encontrei

Veja como atualizar coisas com Rails, mas ler um desses guias rapidamente te dará uma ideia de como funciona.

t=Topic.find(123)
t.title='meu novo título'
t.save

# ou
t.update(title: 'meu novo título')

Quando você faz coisas através do Rails, ele faz um monte de verificações, se as coisas. Essas coisas geralmente te impedirão de cometer grandes erros. Provavelmente, você não deve quebrar essas regras até entendê-las.

Por exemplo, se você quer que os usuários criem tópicos em uma determinada categoria via API, então eles precisam ter direitos para criar um tópico nessa categoria. Se você realmente quer que um tópico criado por um usuário exista em uma categoria para a qual ele não tem direitos, então crie-o em outra categoria e peça a um administrador para movê-lo (ou faça isso via Rails, que não imporá permissões de categoria).

8 curtidas

O console do Rails fala ruby.

Como o Discourse é de código aberto, você pode aprender programação de baixo nível lendo o código-fonte no GitHub.

1 curtida

t=Topic.find(123)
t.title=‘meu novo título’
t.save

ou

t.update(title: ‘meu novo título’)

Obrigado. Uma coisa que não consegui descobrir foi como atribuir um valor com um valor extraído de algum lugar, por exemplo.

t.update(title: topic2.find(123).title)

1 curtida

Você poderia fazer algo como:

t = Topic.find(123)
t.update(title: Topic.find(124).title)

Mas isso dá mais trabalho do que vale a pena. Você pode fazer as coisas em etapas:

t1 = Topic.find(123)
t2 = Topic.find(124)
t1.update(title: t2.title)
3 curtidas

Eu também: About this Book :: Why's (Poignant) Guide to Ruby

5 curtidas

Embora isso possa facilmente causar uma exceção (que você é aconselhado a resgatar), então você pode querer usar find_by como uma alternativa que retornará nil em vez de levantar uma exceção, dependendo de como você deseja gerenciar as coisas.

4 curtidas

Cara. Eu sempre pensei que RoR fosse uma relíquia dos anos 2000, nunca imaginei que estaria aprendendo isso! :slight_smile:

1 curtida

SQL é uma relíquia dos anos 1960. :winking_face_with_tongue:

1 curtida

“Nicho” paga as contas!

3 curtidas

Estou usando IA para escrever consultas SQL. Ela consegue fazer isso muito mais rápido do que eu!

É assim que somos iguais. Eu precisava fazer um sql com um inner join complicado e outro com um union simples que pedi ajuda à IA. Eu me arrependi de não ter prestado um pouco mais de atenção na minha aula de banco de dados em 1986, eu saberia como fazer. :rofl:

Por que não pedir à IA para escrever comandos do rails para você?

Para consultas padrão de seleção, onde, ordenação e limite, eu mesmo escrevo, mas para qualquer coisa mais complicada, agora pergunto à IA. Eu perguntei à IA:

“escreva uma consulta que mostre uma categoria e, em seguida, liste os 5 principais iniciadores de tópicos para essa categoria e o número de tópicos que eles iniciaram”

E imediatamente ela retornou (este é um banco de dados não-discourse):

WITH TopTopicStarters AS (
    SELECT
        c.id AS category_id,
        c.name AS category_name,
        u.name AS user_name,
        COUNT(t.id) AS num_topics_started,
        ROW_NUMBER() OVER(PARTITION BY c.id ORDER BY COUNT(t.id) DESC) AS rank
    FROM topics t
    JOIN categories c ON t.category_id = c.id
    JOIN users u ON t.user_id = u.userid
    GROUP BY c.id, u.name
)

SELECT 
    c.category_name,
    tts.user_name,
    tts.num_topics_started
FROM categories c
JOIN TopTopicStarters tts ON c.id = tts.category_id
WHERE tts.rank <= 5;

Não há como eu ter chegado a isso sem muita pesquisa no Google e tentativa e erro!

Existem muitos exemplos no plugin e na categoria do explorador de dados.

2 curtidas