RubyTutorial.org:无效的SQL语句在pageshome上生成500个响应
虽然视图包含了我认为正确的除非语句来显示提要,但是当用户没有跟踪任何人时,micropost.rb模型中的SQL方法似乎是无效的。此错误在部署环境(如Heroku)中是透明的-以下是从应用程序生成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
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子句。至少这样您就不会有被传入的危险,我假设用户总是被定义的。编辑:刚刚意识到你已经解决了你的问题。对不起,没问题!谢谢你这么棒,卡姆+