3

私のプロジェクトには、次のレガシー コードがありました。

Model.find(id, :readonly => false)

どうやら、IDで検索し、読み取り専用ではないオブジェクトのみを検索しました。ただし、readonly はモデルの属性ではありません。これは、そのインスタンスが読み取り専用インスタンスであるかどうかを定義する実際の ActiveRecord プロパティをチェックする必要があります。それがこのコードが実際に行っていることかどうかはわかりません。おそらく :readonly => false は役に立たないでしょう。しかし、予想される警告が表示されます。

DEPRECATION WARNING: Passing options to #find is deprecated. Please build a scope and then call #find on it.

また、SQL属性ではないため、SQLで読み取り専用かどうかを確認できないため、whereに置き換えることはできません。

エラーは、スコープ内にある場合、find を引き続き使用できることを実際に明示的に示しています。しかし、次のようにスコープを作成しました。

scope :by_id_not_readonly, ->(id) { find(id, :readonly => false) }

ただし、同じ警告がスローされますが、コントローラーではなくモデルのスコープ宣言行で...


私はいくつかの他のテストを行いました:

それを where('id = ? AND readonly = false', id) に置き換えると、例外として、実際にはエラーが発生します- readonly はモデルの適切なものではありません。

読み取り専用ビットなしでコードを実行すると、読み取り専用レコードが返され、コードが後でそれらを更新しようとしてエラーが発生するため、テストが中断されます。

find(id, :readonly => false, :ldisfs32j9fmdf90sdfds => false) などの不正なオプションを検索ハッシュに追加すると、例外として不明なキー エラーが発生します。


したがって、この :readonly ビットは非常に重要ですが、単純な where に置き換えることはできません。新しいバージョンのレールでどうすればできますか?

4

1 に答える 1