deleteメソッドとdestroyメソッドの違い
通常、データの削除にはdestroyを使います。
destroyメソッドはデータを削除するときにActiveRecordを介します。
一方、deleteメソッドはActiveRecordを介さずにSQLを直接実行してデータを削除します。
処理速度はもちろんdeleteメソッドのほうが早くなります。
しかしながら、モデルを介さないためバリデーションもdeleteには作用せず速やかに削除されるため、誤った操作でも取り返しがつかないことになってしまいます。
また、アソシエーションを組んでいてdependentを指定していたとしても、紐づいているレコードが削除されることはありません。
deleteは強制的な削除が必要なときに活きそうです。
Arel.sql( ).の使い方
モデルにSQLを記述したところ、警告が出ました。
ActiveRecord::UnknownAttributeReference in xxxxxxxxx::xxxxxxxxxxController#index Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "xxxxxxxxxxxxxxxxxxx".This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql().
危険なクエリメソッド(引数が生のSQLとして使用されるメソッド)、つまり、SQLインジェクションの危険性をはらんでいる点を指摘しています。
「モデル属性など既知の安全な値は、Arel.sql() でラップして渡すことができる」と書いてありますが、安易に使って良いものとは思えなかったため確認しました。
参照:Arel.sqlを付けるだけじゃダメ!? Railsで"Dangerous query method …”の警告が出たときの対応方法
この警告は、私がorderに生SQLの文字列を渡したために発生したものでした。
今回の場合は、他のメソッドを使うかたちにしましたが、都度確認する手間は惜しまず慎重に対処しようと思いました。
並び替えメソッド(複数条件)
特定の要素のみ先頭に、後は登録順に並び替えるメソッドを考えました。
今回は対象のデータがコレクションであったため、先に登録順に並び替えてから、ブロックを渡して評価するかたちにしました。
sort_byメソッドは、指定したブロック内の条件に基づいてソートを行います。
この場合、"item.id" が10と等しい場合は0を返し、それ以外は1を返すようにしています。この結果、"item.id"が10のデータが先頭に来ます。
self.order(created_at: :asc).sort_by do |item| (item.id == 10 ) ? 0 : 1
RailsのMVCモデル
MVCモデルにはいくつか種類があるらしいと知りました。
まだまだ理解が足りていないのですが、Railsを使っているのでRailsのMVCはきちんと抑えておきたいところです。
以下の記事で復習させていただきました。
参照:MVC2