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

标签 ruby-on-rails ruby-on-rails-3 postgresql syntax railstutorial.org

我在 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/

相关文章:

ruby-on-rails-3 - 具有 pg_search 结果顺序的 Postgresql trigram 文本搜索

c# - json_agg() 数组到对象

ruby-on-rails - 如何重定向未经授权的

ruby-on-rails - simple_form gem 中的 text_field_tag

ruby-on-rails-3 - Rails 方法运行设置超时 - 确定方法中的线程 "stays"多长时间

sql - PostgreSQL:根据间隔对列进行分组

postgresql - SELECT 语句的历史结果

ruby-on-rails - 如何设置标签的最小和最大数量?

ruby-on-rails - 返回按日期排序的多个独立关联的记录

ruby-on-rails-3 - 需要在Rails 3.2中使用OmniAuth-Twitter进行OAuth::Unauthorized 401授权