RailsTutorial 3.2 Ch 11 - синтаксическая ошибка PostgreSQL нарушает статус канала - PullRequest
2 голосов
/ 22 февраля 2012

Я нахожусь в Разделе 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 более чистым).

Похоже, что ошибка домашней страницы происходит из-за того, что идентификаторы передаются в запрос с кавычками - я вошел в 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

1 Ответ

8 голосов
/ 22 февраля 2012

Черт возьми, я сам понял это.Просто пришлось удалить объединение в определении метода:

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

что я и хотел.

...