BETA

ActiveRecordのhas_manyの子供たちをmark_for_destructionで消すときは内部の状態をArray化しておかないと消せない

投稿日:2018-11-06
最終更新:2018-11-06

問題のコード。 ID:1 を削除したいのに消えていない。 あらかじめ user.articles.to_a などを実行して articles の内部を配列しておくと消せるようになる。 このコードは articles.first としているため配列化できてないせいで失敗していた。 リファクタリングの際などに user.articles.to_a を外してしまうと挙動が変わってしまうので注意しよ。

require "active_record"
ActiveRecord::VERSION::STRING   # => "5.2.1"
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
ActiveSupport::LogSubscriber.colorize_logging = false
ActiveRecord::Migration.verbose = false

ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Schema.define do
  create_table :users do |t|
    t.string :name
  end
  create_table :articles do |t|
    t.belongs_to :user
  end
end

class User < ActiveRecord::Base
  has_many :articles, autosave: true
end

class Article < ActiveRecord::Base
  belongs_to :user
end

user = User.create!
user.articles.create!
user.articles.create!
user.article_ids         # => [1, 2]

# user.articles.to_a # ここをコメントアウトすると通る

article = user.articles.first   # => #<Article id: 1, user_id: 1>
article.mark_for_destruction
article.marked_for_destruction?  # => true

user.save!
user.article_ids         # => [1, 2]
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@warabimochiの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!