gpt4 book ai didi

ruby-on-rails - RailsTutorial 3.2 Ch 11 - PostgreSQL 语法错误中断状态提要

转载 作者:行者123 更新时间:2023-11-29 11:53:51 25 4
gpt4 key购买 nike

我在 Section 11.3.1的 Rails 教程,所有测试都在此之前通过。之后,主页(有微博提要)因以下错误而中断:

PG::Error: ERROR:  invalid input syntax for integer: "98, 1"
LINE 1: ...CT COUNT(*) FROM "microposts" WHERE (user_id IN ('98, 1') O...
^
: SELECT COUNT(*) FROM "microposts" WHERE (user_id IN ('98, 1') OR user_id = 101)

并且有几个测试因类似问题而失败。这是第一个:

1) Authentication authorization as wrong user visiting Users#edit page 
Failure/Error: before { visit edit_user_path(wrong_user) }
ActionView::Template::Error:
PG::Error: ERROR: invalid input syntax for integer: ""
LINE 1: ...CT COUNT(*) FROM "microposts" WHERE (user_id IN ('') OR use...
^

现在,我使用的是 PostgreSQL 而不是默认的 SQLite3,因此可能存在语法冲突,但我并不肯定。我不是很熟悉 Postgres(只是用它来使 Heroku 部署更干净)。

主页错误似乎是由于将 id 传递给带引号的查询 - 我进入 psql 测试了几个查询,结果成功了:

SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN (1,2,3);

虽然失败了:

SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN ('1,2,3');

规范错误来自传递的空数组,等同于此,但也失败了:

SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN ('');

熟悉 PostgreSQL 语法的人能告诉我如何重写方法定义来解决这个问题吗?

micropost.rb 中的当前方法如下所示:

def self.from_users_followed_by(user)
followed_user_ids = user.followed_user_ids.join(', ')
where("user_id IN (?) OR user_id = ?", followed_user_ids, user)
end

来自“users.rb”的调用如下所示:

def feed
Micropost.from_users_followed_by(self)
end

最佳答案

天哪,我居然自己想出来了。只需删除方法定义中的连接:

def self.from_users_followed_by(user)
followed_user_ids = user.followed_user_ids
where("user_id IN (?) OR user_id = ?", followed_user_ids, user)
end

user.followed_user_ids.join(', ') 产生这个:“1, 2, 3”

同时

user.followed_user_ids 产生这个:1, 2, 3

这就是我想要的。

关于ruby-on-rails - RailsTutorial 3.2 Ch 11 - PostgreSQL 语法错误中断状态提要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9397954/

25 4 0
文章推荐: mysql - 存储过程具有数据类型为 VARCHAR 的 OUT 参数,希望删除其引号以在 INT 类型的 IN 子句中使用它
文章推荐: html - AngularJS 1.5-