Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RubyTutorial.org:无效的SQL语句在pageshome上生成500个响应_Ruby_Ruby On Rails 3_Activerecord - Fatal编程技术网

RubyTutorial.org:无效的SQL语句在pageshome上生成500个响应

RubyTutorial.org:无效的SQL语句在pageshome上生成500个响应,ruby,ruby-on-rails-3,activerecord,Ruby,Ruby On Rails 3,Activerecord,虽然视图包含了我认为正确的除非语句来显示提要,但是当用户没有跟踪任何人时,micropost.rb模型中的SQL方法似乎是无效的。此错误在部署环境(如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 ActiveR

虽然视图包含了我认为正确的除非语句来显示提要,但是当用户没有跟踪任何人时,micropost.rb模型中的SQL方法似乎是无效的。此错误在部署环境(如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\u controller.rb:6:in'home'

问题是,我如何解决这个问题,没有黑客修复,如自动跟踪用户的user.create


这是有帮助的,这个问题的要点如下:

在micropost模型中删除最初的self.from_users_following_by method,而保留private self.following by user方法独立,似乎已经解决了这个问题。所有测试都通过了

来自models/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

不必像在from_users_后面跟着方法中那样手工构建查询字符串。我会这样做:

def self.from_users_followed_by(user)
  followed_ids = user.following.map(&:id) + user.id
  where(:user_id => followed_ids)
end

谢谢cam,事实上我意识到了这一点,但是Hartl要求我们使用手工构建的SQL查询-可能只是为了给初学者一些SQL的味道。这个过程的整个部分有点像意大利面条——不过谢谢你的代码建议@乔恩·保罗:有趣。在这种情况下,也许您仍然应该将user.id添加到后面的\u id数组中,并删除OR user\u id子句。至少这样您就不会有被传入的危险,我假设用户总是被定义的。编辑:刚刚意识到你已经解决了你的问题。对不起,没问题!谢谢你这么棒,卡姆+