レコードがレールで破壊されたかどうかを確認します


83

だからあります

record.new_record?

何かが新しいかどうかを確認するには

何かが途中にあるかどうかを確認する必要があります。

record = some_magic
record.destroy
record.is_destroyed? # => true

そんな感じ。破壊するとオブジェクトがフリーズするので、フリーズしますか?ある種の作業ですが、このタスクに明示的に何かありますか?

回答:


51

あなたはこれを行うことができます。

Record.exists?(record)

ただし、これはデータベースに影響を与えますが、実際には必要ありません。私が知っている他の唯一の解決策は、IVが述べたようにコールバックを行うことです。

attr_accessor :destroyed
after_destroy :mark_as_destroyed
def mark_as_destroyed
  self.destroyed = true
end

そして、チェックしrecord.destroyedます。


2
ここでは、いくつかのコンテキストが役立つと思います。オブジェクトが破壊されたかどうかを知りたい理由によって異なります。単体テストの一部として実行している場合は、データベースに対する追加のヒットは問題ありません。アプリの一部としてそれを行っている場合は、2番目のルートに行く方が良いかもしれません。
jerhinesmith 2009年

67
これはもう必要ありません、使用object.destroyed?
ロブ

2
Rails 4にはDEPRECATION WARNING: You are passing an instance of ActiveRecord::Base to 存在しますか?. Please pass the id of the object by calling .id.
Minqi Pan

5
Record.exists?破壊されたレコードをリロードしてそれがであるかどうかを確認できないため、コントローラーの仕様にはまだ必要ですdestroyed?。ただし、チェックするインスタンス変数がある場合はassings、を使用できますdestroyed?
denis.peplin 2016年

@Daniel Huckstep、まだ生きている場合は、受け入れられた答えを正しいものに変更してください!
ダニエル


11

これはもうすぐです。最新のRidingRailsの投稿では、次のように述べています。

そして最後に、それは必ずしもBugMash関連ではありませんが、JoséValim-他の何十ものコミットの中で-model.destroyed?を追加しました。この気の利いたメソッドは、現在表示しているインスタンスが正常に破棄された場合にのみtrueを返します。

だからあなたは行き​​ます。近日公開!


6

record.destroyed中?正常に動作し、trueまたはfalseを返します。これを少し乾かして、コントローラーでdestroyを呼び出す行にif条件を作成することもできます。

record = Object.find(params[:id])
if record.destroy
  ... happy path
else
  ... sad path
end

この投稿はゲームの少し遅いことを認識してください。しかし、誰かがこれについてもっと話したいと思うなら、私はゲームです!補足:モデルでafter_destroy検証も行いましたが、それが機能している間、このような別のメソッドはやり過ぎのようです;)


5

destroyオブジェクトを実行してもfreeze(私が知る限り)への呼び出し以外は何も返されないのでfrozen?、最善の策だと思います。あなたの他のオプションはActiveRecord::RecordNotFound、あなたが次のようなことをした場合から救助することですrecord.reload

上記のマイクの戦術が最善だと思います。または、「仮定を立てる」ことを開始したい場合は、言及されたこれらのケースのラッパーを作成することもできます。

乾杯。


私は現在、冷凍をチェックしていますか?しかし、実際には何かをロードして他の目的で冷凍することができ、それは嘘になります...現在の状況では、冷凍ですか?正常に動作しますが、長期的には信頼したくありません。
ダニエルハックステップ2009

0

あなたのアプリのロジックをもっと知らなくても、私はそれが凍結していると思いますか?あなたの最善の策です。

それができない場合は、コールバックでトリガーする「破棄された」属性をモデルに追加し、より正確なソリューションが必要な場合にチェックすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.