我找到了 rails console 并了解到你可以执行一些黑魔法操作,例如:
DB.exec(<<~SQL)
UPDATE topics
SET title = 'psql redo!'
WHERE id = 886
SQL
我该如何找出可以在控制台中执行的命令/函数?我该如何了解更多关于这种魔法的信息?
注意:如果还不明显的话,我完全不懂 Ruby 或 Rails。
我找到了 rails console 并了解到你可以执行一些黑魔法操作,例如:
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 不会强制执行类别权限)。
Rails 控制台支持 Ruby。
由于 Discourse 是开源的,您可以通过阅读 GitHub 上的源代码来学习底层编程。
t=Topic.find(123)
t.title=‘my new title’
t.save
t.update(title: ‘my new title’)
谢谢。我无法弄清楚的一件事是如何分配一个从某处提取的值,例如
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)
虽然这很容易导致异常(建议您捕获它),因此您可能希望改用 find_by,它将返回 nil 而不是引发异常,具体取决于您想要如何管理。
我一直以为RoR是上个世纪的遗物,真没想到我竟然会学这个! ![]()
SQL 是 20 世纪 60 年代的遗留物。![]()
“利基”能支付账单!
我实际上正在使用人工智能来编写 SQL 查询。它比我快得多!
我们就是这样相同的。我需要做一些复杂的内连接 SQL 查询,以及一个简单的联合查询,我让 AI 帮我完成了。我当时真希望 1986 年上数据库课时能更专心一点,那样我就知道怎么做了。![]()
为什么不让 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 的帮助,我绝对不可能在不大量搜索和反复试验的情况下想出这个!
数据浏览器插件和类别中有许多示例。