Команды консоли Rails

Я нашёл консоль Rails и узнал, что там можно творить настоящую магию, например:

DB.exec(<<~SQL)
  UPDATE topics
  SET title = 'psql redo!'
  WHERE id = 886
SQL

Как узнать, какие команды или функции можно выполнять в консоли? Где можно больше узнать об этой волшебной магии?

Примечание: если это не очевидно, я ничего не знаю о Ruby или Rails.

Вам действительно нужно изучить Rails и не изменять базу данных напрямую. Я поступил так: нашел книгу по Rails и прочитал её. Также в какой-то момент я обратился к книге по Ruby. Я достаточно стар, чтобы помнить времена, когда книги были единственным способом обучения компьютерным технологиям. Насколько я понимаю, в интернете существует множество сайтов, предлагающих учебные пособия по Rails. Думаю, вы можете найти их через поиск в интернете.

Вот один из них, который я нашел:

Вот как обновлять данные с помощью Rails, но прочтение одного из таких руководств быстро даст вам представление о том, как это работает.

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

# или
t.update(title: 'my new title')

Когда вы выполняете действия через Rails, система проводит множество проверок. Эти проверки обычно предотвращают совершение крупных ошибок. Вам, вероятно, не следует нарушать эти правила, пока вы их не поймете.

Например, если вы хотите, чтобы пользователи создавали темы в определенной категории через API, у них должны быть права на создание темы в этой категории. Если вы действительно хотите, чтобы тема, созданная пользователем, существовала в категории, для которой у него нет прав, создайте её в другой категории, а затем попросите администратора переместить её (или сделайте это через Rails, где проверка прав доступа к категории не применяется).

Консоль Rails работает на Ruby.

Поскольку Discourse имеет открытый исходный код, вы можете изучить низкоуровневое программирование, читая исходный код на GitHub.

t = Topic.find(123)
t.title = ‘my новый заголовок’
t.save

или

t.update(title: ‘my новый заголовок’)

Спасибо. Один момент, который мне не удалось выяснить, — как присвоить значение, полученное откуда-то, например:

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

Вы можете сделать что-то вроде:

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

Но это больше хлопот, чем пользы. Вы можете выполнить это поэтапно:

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

То же самое: About this Book :: Why's (Poignant) Guide to Ruby

Хотя это может легко вызвать исключение (которое рекомендуется перехватывать), поэтому, возможно, стоит использовать find_by в качестве альтернативы. Он вернёт nil, вместо того чтобы выбрасывать исключение, в зависимости от того, как вы хотите управлять ситуацией.

Черт. Я всегда думал, что RoR — это реликт нулевых, и никогда не мог представить, что сам займусь изучением этого! :slight_smile:

SQL — это реликт 1960-х годов. :winking_face_with_tongue:

«Ниша» оплачивает счета!

На самом деле я использую ИИ для написания SQL-запросов. Он делает это намного быстрее меня!

Вот в чём мы похожи. Мне нужно было выполнить SQL-запрос со сложным внутренним соединением и ещё один с простым объединением, и я попросил ИИ помочь. Дрожу, что если бы я чуть внимательнее слушал на занятиях по базам данных в 1986 году, то сам бы знал, как это сделать. :rofl:

Почему бы не попросить ИИ написать для тебя команды Rails?

Для стандартных запросов select, where, sort, limit я пишу это сам, но всё, что сложнее, я теперь поручаю ИИ. Я спросил ИИ:

напиши запрос, который показывает категорию, а затем перечисляет топ-5 авторов тем для этой категории и количество созданных ими тем

И сразу получил ответ (это не база данных 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;

Я бы точно не смог придумать это сам без долгих поисков в Google и множества проб и ошибок!

В плагине и категории «Обозреватель данных» приведено множество примеров.