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

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
于 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 に答える