Comandi della console Rails

Ho trovato la console di Rails e ho scoperto che puoi fare magie nere come:\n\n```
DB.exec(<<~SQL)
UPDATE topics
SET title = ‘psql redo!’
WHERE id = 886
SQL


Come faccio a scoprire quali comandi/funzioni possono essere eseguiti nella console? Come posso saperne di più su questa stregoneria?\n\nNota: se non fosse già ovvio, non so nulla di Ruby o Rails.
1 Mi Piace

Dovresti davvero imparare a usare Rails e non modificare direttamente quel database. Quello che ho fatto è stato trovare un libro su Rails e leggerlo. E a un certo punto ho anche guardato un libro su Ruby. Sono abbastanza vecchio da ricordare quando i libri erano l’unico modo per imparare sui computer. Per quanto ne so, ci sono molti siti su Internet che possono fornirti un tutorial su Rails. Penso che ci sia un modo per cercarli su Internet.

Eccone uno che ho trovato

Ecco come aggiornare le cose con Rails, ma leggere una di quelle guide ti darà rapidamente un’idea di come funziona.

t=Topic.find(123)
t.title='my new title'
t.save

# or
t.update(title: 'my new title')

Quando fai le cose tramite Rails, esegue una serie di controlli. Queste cose di solito ti eviteranno di commettere errori enormi. Probabilmente non dovresti infrangere quelle regole finché non le capisci.

Ad esempio, se vuoi che gli utenti creino argomenti in una determinata categoria tramite l’API, allora devono avere i diritti per creare un argomento in quella categoria. Se vuoi davvero che un argomento creato da un utente esista in una categoria per cui non ha i diritti, allora crealo in un’altra categoria e poi fai in modo che un amministratore lo sposti (o fallo tramite Rails, che non applicherà le autorizzazioni di categoria).

8 Mi Piace

La console di Rails parla ruby.

Poiché Discourse è open source, puoi imparare la programmazione di basso livello leggendo il codice sorgente su GitHub.

1 Mi Piace

t=Topic.find(123)
t.title=‘my new title’
t.save

oppure

t.update(title: ‘my new title’)

Grazie. Una cosa che non sono riuscito a capire è come assegnare un valore con un valore estratto da qualche parte, ad esempio

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

1 Mi Piace

Potresti fare qualcosa del tipo:

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

Ma è più complicato del necessario. Puoi fare le cose per passi:

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

Anch’io: About this Book :: Why's (Poignant) Guide to Ruby

5 Mi Piace

Sebbene ciò possa facilmente causare un’eccezione (che si consiglia di gestire), potresti voler utilizzare find_by come alternativa che restituirà nil anziché sollevare un’eccezione, a seconda di come desideri gestire le cose.

4 Mi Piace

Cavolo. Ho sempre pensato che RoR fosse un reperto degli anni 2000, non avrei mai immaginato di trovarmi a impararlo! :slight_smile:

1 Mi Piace

SQL è un reperto degli anni '60. :winking_face_with_tongue:

1 Mi Piace

“Niche” paga le bollette!

3 Mi Piace

Sto usando l’IA per scrivere query SQL. Può farlo molto più velocemente di me!

È così che siamo uguali. Avevo bisogno di fare un po’ di sql con un inner join complicato e un altro con una semplice union che ho fatto fare all’IA. Mi pento di non aver prestato un po’ più di attenzione alla mia classe di database nel 1986, avrei saputo come farlo. :rofl:

Perché non far scrivere all’IA i comandi rails per te?

Per le query standard di select, where, sort, limit, le scrivo da solo, ma per qualsiasi cosa di più complicato, chiedo all’IA. Ho chiesto all’IA:

“scrivi una query che mostri una categoria e poi elenchi i primi 5 iniziatori di argomenti per quella categoria e il numero di argomenti che hanno avviato”

E immediatamente mi ha restituito (questo è un database non-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;

Non c’è modo che avrei potuto ideare quello senza un sacco di ricerche su Google e tentativi ed errori!

Ci sono molti esempi nel plugin data explorer e nella categoria.

2 Mi Piace