私の Rails アプリがact_as_commentable_with_threading gem を使用して Recipe と Comment の関係を持ち、その Recipe gem にparanoid2 gem が構成されているとします。古いシステムから新しいシステムへの移行で、コメント テーブルにレコードを手動で挿入して新しいレコードを作成しましたが、誤ってすべてのレシピに対して重複したコメントを作成してしまいました。ここで、この SO questionの解決策を変更して、重複したレコードを削除したいと思いました。
# app/models/recipe.rb
class Recipe < ActiveRecord::Base
acts_as_commentable
paranoid
# other configurations and methods
end
# app/models/comment.rb
class Comment < ActiveRecord::Base
paranoid
def self.dedupe_recipe_comments
grouped = all.where(commentable_type: "Recipe").group_by{|model| [model.commentable_id,model.body,model.user_id,model.commentable_username] }
grouped.values.each do |duplicates|
first_one = duplicates.shift
duplicates.each do |double|
puts "removing #{double.inspect} from table"
double.destroy(force: true)
end
end
end
しかし、Rails コンソールでこの関数を呼び出すと、この関数はエラーを返します。たとえば、最初に重複したレコードの値id
が 1480 であるとします。
ActiveRecord::RecordNotFound: /Users/yoonwaiyan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.0/lib から 'id'=1480 のコメントが見つかりませんでした/active_record/relation/finder_methods.rb:320:`raise_record_not_found_exception!' で
しかし、を使用して同じコンソールでレコードを検索しようとすると、次のレコードComment.find(1480)
が返されます。
#<Comment id: 1480, commentable_id: 51, commentable_type: "Recipe", body: "comment content", user_id: 0, parent_id: nil, lft: nil, rgt: nil, created_at: "2006-05-16 18:48:03", updated_at: "2015-07-25 16:17:17", status: "approved", deleted_at: nil, commentable_username: "user1">
そして、コンソールで破棄しようとしました:
Comment.find(1480).destroy(force: true)
同じエラーが返されます。
コメント ロード (0.3ms) SELECT
comments
.* FROMcomments
WHEREcomments
.deleted_at
NULL ANDcomments
です。id
= 1480 リミット 1(0.1ms) BEGIN
SQL (0.3ms) DELETE FROM
comments
WHEREcomments
.id
= 1480コメント ロード (0.2ms) SELECT
comments
.* FROMcomments
WHEREcomments
.id
= 1480 リミット 1(12.5ms) ロールバック
ActiveRecord::RecordNotFound: /Users/yoonwaiyan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.0/lib から 'id'=1480 のコメントが見つかりませんでした/active_record/relation/finder_methods.rb:320:`raise_record_not_found_exception!' で
このエラーは奇妙で、gem と Stack Overflow の両方で適切な解決策を見つけることができませんでした。どんな助けでも大歓迎です。