RubyTutorial.org: неверный оператор SQL генерирует 500 ответов на страницах # home - PullRequest
1 голос
/ 31 января 2011

В то время как представление содержит (как я полагаю) правильный оператор UNLESS для отображения канала, метод SQL из модели micropost.rb кажется недействительным, когда пользователь ни за кем не следует.Эта ошибка прозрачна в среде развертывания (такой как Heroku) - вот фрагмент журнала, который генерирует 500-ответный ответ от приложения:

Started GET "/" for 71.180.163.2 at Mon Jan 31 12:10:07 -0800 2011
  Processing by PagesController#home as HTML
Completed   in 9ms


ActiveRecord::StatementInvalid (PGError: ERROR:  syntax error at or near ")"
LINE 1: ...* FROM       "microposts"  WHERE     (user_id IN () OR user_...
                                                            ^

: SELECT     "microposts".* FROM       "microposts"  WHERE     (user_id IN () OR user_id = 1) ORDER BY  microposts.created_at DESC LIMIT 30 OFFSET 0):

app / controllers / pages_controller.rb: 6: in `home '

Вопрос в том, как мне решить эту проблему без хакерских исправлений, таких как автоматическое отслеживание пользователя на User.create!

Если это поможет, суть этой проблемы здесь: https://gist.github.com/804754

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Нет необходимости создавать строку запроса вручную, как это делается в вашем методе from_users_followed_by. Я бы сделал что-то вроде:

def self.from_users_followed_by(user)
  followed_ids = user.following.map(&:id) + user.id
  where(:user_id => followed_ids)
end
1 голос
/ 01 февраля 2011

Удаление начального метода self.from_users_followed_by в модели микросообщений, оставление частного метода self.followed_by (user) в одиночестве, похоже, решило проблему. Все тесты пройдены.

Из моделей / micropost.rb

class Micropost < ActiveRecord::Base
attr_accessible :content

belongs_to :user

validates :content, :presence => true, :length => { :maximum => 140 }
validates :user_id, :presence => true

default_scope :order => 'microposts.created_at DESC'

#Return microposts from the users being followed by the given user--
scope :from_users_followed_by, lambda { |user| followed_by(user) }
# 
# def self.from_users_followed_by(user)
#   followed_ids = user.following.map(&:id).join(", ")
#   where("user_id IN (#{followed_ids}) OR user_id = ?", user)
# end

private

#Return an SQL condition for users followed by the given user.
#We include the user's own ID as well--
def self.followed_by(user)
  followed_ids = %(SELECT followed_id FROM relationships
                   WHERE follower_id = :user_id)
  where("user_id IN (#{followed_ids}) OR user_id = :user_id",
        :user_id => user)
end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...