Rails 控制台命令

我找到了 rails console 并了解到你可以执行一些黑魔法操作,例如:

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

我该如何找出可以在控制台中执行的命令/函数?我该如何了解更多关于这种魔法的信息?

注意:如果还不明显的话,我完全不懂 Ruby 或 Rails。

1 个赞

您真的需要了解 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 不会强制执行类别权限)。

8 个赞

Rails 控制台支持 Ruby。

由于 Discourse 是开源的,您可以通过阅读 GitHub 上的源代码来学习底层编程。

1 个赞

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

或者

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

谢谢。我无法弄清楚的一件事是如何分配一个从某处提取的值,例如

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

1 个赞

您可以这样做:

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

但这比它本身更麻烦。您可以分步进行:

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

我也是:About this Book :: Why's (Poignant) Guide to Ruby

5 个赞

虽然这很容易导致异常(建议您捕获它),因此您可能希望改用 find_by,它将返回 nil 而不是引发异常,具体取决于您想要如何管理。

4 个赞

我一直以为RoR是上个世纪的遗物,真没想到我竟然会学这个! :slight_smile:

1 个赞

SQL 是 20 世纪 60 年代的遗留物。:winking_face_with_tongue:

1 个赞

“利基”能支付账单!

3 个赞

我实际上正在使用人工智能来编写 SQL 查询。它比我快得多!

我们就是这样相同的。我需要做一些复杂的内连接 SQL 查询,以及一个简单的联合查询,我让 AI 帮我完成了。我当时真希望 1986 年上数据库课时能更专心一点,那样我就知道怎么做了。:rofl:

为什么不让 AI 帮你编写 Rails 命令呢?

对于标准的 select、where、sort、limit 查询,我自己就能写,但更复杂的查询,我现在会问 AI。我问 AI:

“写一个查询,显示一个类别,然后列出该类别下排名前 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;

没有 AI 的帮助,我绝对不可能在不大量搜索和反复试验的情况下想出这个!

数据浏览器插件和类别中有许多示例。

2 个赞