leaning diary Rails

【Learning Dairy26】deleteとdestroyの違い/Arel.sql( ).の使い方/並び替えメソッド(複数条件)

【Learning Dairy26】deleteとdestroyの違い/Arel.sql( ).の使い方/並び替えメソッド(複数条件)

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

 

-leaning diary, Rails