Comandos de la consola Rails

Encontré la consola de Rails y aprendí que puedes hacer magia negra como:\n\n```
DB.exec(<<~SQL)
UPDATE topics
SET title = ‘psql redo!’
WHERE id = 886
SQL


¿Cómo puedo averiguar qué comandos/funciones se pueden ejecutar en la consola? ¿Cómo puedo aprender más sobre esta hechicería?\n\nNota: si aún no es obvio, no sé nada sobre Ruby o Rails.
1 me gusta

Realmente necesitas aprender sobre Rails y no modificar esa base de datos directamente. Lo que hice fue encontrar un libro de Rails y leerlo. Y en algún momento también miré un libro de Ruby. Soy lo suficientemente mayor como para recordar cuando los libros eran la única forma de aprender sobre computadoras. Según entiendo, hay muchos sitios en Internet que pueden darte un tutorial de Rails. Creo que hay una manera de buscar en Internet para encontrarlos.

Aquí hay uno que encontré

Así es como se actualizan las cosas con Rails, pero leer una de esas guías te dará rápidamente una idea de cómo funciona.

t=Topic.find(123)
t.title='mi nuevo título'
t.save

# o
t.update(title: 'mi nuevo título')

Cuando haces cosas a través de Rails, realiza una serie de comprobaciones. Estas cosas generalmente te evitarán cometer grandes errores. Probablemente no deberías romper esas reglas hasta que las entiendas.

Por ejemplo, si quieres que los usuarios creen temas en una categoría específica a través de la API, entonces necesitan tener los derechos para crear un tema en esa categoría. Si realmente quieres que un tema creado por un usuario exista en una categoría para la que no tiene derechos, entonces créalo en otra categoría y luego haz que un administrador lo mueva (o hazlo a través de Rails, lo que no aplicará los permisos de categoría).

8 Me gusta

La consola de Rails habla ruby.

Dado que Discourse es de código abierto, puedes aprender programación de bajo nivel leyendo el código fuente en GitHub.

1 me gusta

t=Topic.find(123)
t.title=‘mi nuevo título’
t.save

o

t.update(title: ‘mi nuevo título’)

Gracias. Una cosa que no pude averiguar fue cómo asignar un valor con un valor extraído de algún lugar, por ejemplo:

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

1 me gusta

Podrías hacer algo como:

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

Pero eso es más complicado de lo que vale. Puedes hacer las cosas por pasos:

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

Yo también: About this Book :: Why's (Poignant) Guide to Ruby

5 Me gusta

Aunque esto podría causar fácilmente una excepción (que se recomienda que rescates), por lo que podrías querer usar find_by como alternativa, que devolverá nil en lugar de lanzar una excepción, dependiendo de cómo quieras gestionar las cosas.

4 Me gusta

¡Hombre! Siempre pensé que RoR era una reliquia de los años 2000, ¡nunca imaginé que me encontraría aprendiendo esto! :slight_smile:

1 me gusta

SQL es una reliquia de la década de 1960. :winking_face_with_tongue:

1 me gusta

“Nicho” paga las facturas.

3 Me gusta

¡De hecho, estoy usando IA para escribir consultas SQL! ¡Puede hacerlo mucho más rápido que yo!

Así es como somos iguales. Necesitaba hacer algo de sql con un inner join complicado y otro con una simple unión en los que la IA me ayudó. Me lamenté si hubiera prestado un poco más de atención en mi clase de bases de datos en 1986, habría sabido cómo hacerlo. :rofl:

¿Por qué no hacer que la IA escriba comandos de rails para ti?

Para consultas estándar de selección, dónde, ordenación y límite, lo escribo yo mismo, pero para cualquier cosa más complicada, ahora le pregunto a la IA. Le pregunté a la IA:

«escribe una consulta que muestre una categoría y luego enumere los 5 principales iniciadores de temas para esa categoría y el número de temas que iniciaron»

Y de inmediato me devolvió (esta es una base de datos que no es de 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;

¡De ninguna manera podría haber ideado eso sin buscar mucho en Google y probar y errar!

Hay muchos ejemplos en el plugin y la categoría del explorador de datos.

2 Me gusta