2

我正在尝试进行迁移,但遇到了一些麻烦。当我尝试在 Heroku 上运行“rake db:migrate”时,我收到一条错误消息。现在我在我的本地主机中发现我在迁移中的代码有问题 - 但我不知道是什么。

这是我的迁移代码:

def change
    add_column :comments, :likes_count, :integer, :default => 0
    Comment.all().each do |comment|
        comment.update_attribute(:likes_count, comment.likes.count)
        comment.save        
    end
  end

这是我在控制台上遇到的错误(当我尝试将此代码复制并粘贴到“rails 控制台”上时):

 SyntaxError: (irb):3: syntax error, unexpected ',', expecting ')'
c.update_attribute (:likes_count, comment.likes.count)
                                 ^
(irb):3: syntax error, unexpected ')', expecting keyword_end

有人可以帮助我吗?

--------------------- 编辑 ---------------
的奇怪的是:我已经在 localhost 上运行了此迁移,并且 localhost 中的所有内容都可以正常工作。但是当我尝试在 Heroku 上运行“rake db:migrate”时,我得到了一个错误——当我尝试在 rails 控制台上运行相同的代码时,我也得到了一个错误(如上所示)。

4

3 回答 3

5

首先,您需要重置列信息,以便表在向其添加值之前知道其新列。

http://apidock.com/rails/ActiveRecord/Base/reset_column_information/class

您也不需要 () in Comment.all().eachComment.all.each很好。您也不需要显式保存,update_attribute 将为您保存更改(http://apidock.com/rails/ActiveResource/Base/update_attribute

最后,您的错误消息与您的代码不匹配,方法调用中有一个流氓空间:

c.update_attribute (:likes_count, comment.likes.count)

删除那个空间

c.update_attribute(:likes_count, comment.likes.count)

看看会发生什么。

编辑:修复后的迁移

def change
  add_column :comments, :likes_count, :integer, :default => 0

  Comment.reset_column_information

  Comment.all.each do |comment|
    comment.update_attribute(:likes_count, comment.likes.count)      
  end
end
于 2013-05-20T13:17:35.603 回答
3

问题似乎是您在左括号和方法名称之间有一个空格。

代替:

comment.update_attribute (:likes_count, comment.likes.count)

尝试:

comment.update_attribute(:likes_count, comment.likes.count)

错误消息还提到c.update_attribute (:likes_count, comment.likes.count)。注意c代替comment

所以,而不是:

Comment.all().each do |c|
  c.update_attribute(:likes_count, comment.likes.count)
  c.save
end

做:

Comment.all.each do |comment|
  comment.update_attribute(:likes_count, comment.likes.count)
end

请注意,没有必要这样做comment.savecomment.update_attribute将已经执行查询。

于 2013-05-20T13:20:06.257 回答
0

试试这个

def change
  add_column :comments, :likes_count, :integer, :default => 0
  Comment.all.each do |comment|
    comment.update_attribute('likes_count', comment.likes.count)
  end
end
于 2013-05-20T13:22:16.827 回答