我正在努力进行迁移,但我遇到了一些麻烦。当我尝试在Heroku上运行“rake db:migrate”时,我收到了一条错误消息。现在我在我的localhost中发现迁移中的代码有问题 - 但我不知道是什么。
这是我的迁移代码:
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 console”上复制并粘贴此代码时):
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控制台上运行相同的代码时,我也遇到了错误(如上所示)。
答案 0 :(得分:5)
首先,您需要重置列信息,以便在向其添加值之前表知道新列。
http://apidock.com/rails/ActiveRecord/Base/reset_column_information/class
你也不需要Comment.all().each
中的(),Comment.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
答案 1 :(得分: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.save
。 comment.update_attribute
已经执行了查询。
答案 2 :(得分: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