2011-05-30 8 views
7

私は現在、RubyとRuby on Railsフレームワークを学び始めています。表recordsに、私は5のIDを持つレコードを見つけることができますし、次のコードを使用してそれを削除することを、私を見つけた:RailsでRecord.all.destroyを使用できないのはなぜですか?

Record.find(5).destroy

これは、レコードを検索するために、SENSE Iチェーンの方法を行い、それを破壊する。

Record.all.destroy

そして、これはNoMethodErrorを返します。私は、テーブル内のすべてのレコードを破棄したい場合allセレクタは、テーブル内のすべてのレコードを選択したとしてしかし、論理的なコマンドは、次のようになります!私はRecord.destroy_allまたはRecord.delete_allを使用してこの作業を行うことができますが、delete_allのようなものを探すのではなく、もっとも論理的な選択肢を使用できない理由を知りたいと思います。私はこのフレームワークには新しいので、私はここで何か基本的なものを見逃している可能性があります。

お返事ありがとうございます。

+0

本当に良い質問です。私は同じことをまず試しました。あなたは 'Record.all.each {| r | r.destroy} 'もちろん、それは' Record.all.destroy'のように論理的ではありません –

答えて

14

デザインの決定でした。 DataMapperはyour approachでした。 destroy_allを明示的に書くことは面倒なことですが、実際には望まないこと(例えば、x = User; ...; x.destroyのようなテーブル内のすべてを削除すること)ができなくなります。

+0

ありがとう - これは私が探していた答えでした。私はそれが、意図しない大量レコードの削除に対して良い防御になるかもしれないと思う。 – element119

3

これを行うには、論理であることに同意します。技術的には、Record.allは、destroyメソッドを実装していないコレクション(またはコレクションへのプロキシ)を返します。

1

あなたは

Record.find(5) 

を持っている場合、これはあなたのテーブル内の行のデータを表しRecordオブジェクト/インスタンスを返します。次に、Recordモデルで定義されているオブジェクトに対して#destroyメソッドを呼び出します。あなたは

Record.all 

を持っている場合、これはArrayオブジェクトを返します

。配列の#destroyを呼び出すには、#destroyメソッドを持つために、RubyのコアArrayクラスを猿パッチする必要があります。

+0

はい、いいえ...ルビーのダイナミックな性質のため、すべての配列オブジェクトにパッチを当てることなく、レール自身がレコードの配列に破壊アクションを挿入することはできますが、設計上の決定ではないと思います。 – DGM

1

Record.destroy_allを回避する最も簡単な方法は、Record.all.each {|r| r.destroy}です。これはあなたのAPIデザインの設定をある程度満足させるかもしれませんが、最初のオプションよりもはるかに遅くなければなりません。

0

実際に(方法で)行うことができます。 .allはアクティブなレコード関係ではなく配列を返しますので、削除するものは何ですか?私はRecord.all.destroyが論理的だとは言わないでしょう - あなたは配列オブジェクトを削除しますか?

mapはproc(&)を受け入れるので、配列内の各オブジェクトに対してそのprocを実行することができます。

これは、目的よりも遅い可能性のあるすべてのオブジェクトのコールバックをトリガすることに注意してください。コールバックをトリガーしたくない場合は、破壊するのではなく適切な破壊的なメソッドをマップすることができます。(ヒント:削除)

代わりに、あなただけ行うことができます:

Record.destroy_all or Record.delete_all 

あなたは、あなたの質問に述べたように。

関連する問題