この記事では、通常のbelongs_to
ではなく、 database_validations db_belongs_to
を使用する必要がある理由を示します。
私はあなたのほとんどがORM ActiveRecordの belongs_to
精通しているとbelongs_to
しています。 しかし、モデルでbelongs_to
を使用して接続を初期化すると、接続の存在に検証が追加されることをbelongs_to
これは、 belongs_to
はデフォルトでoptional: false
オプションがあるためです。
したがって、新しいオブジェクトを保存するか、既存のオブジェクトを更新するたびに、各リンクに対して追加のSQL SELECTクエリを実行します。
例
class User < ActiveRecord::Base belongs_to :company belongs_to :country end user = User.first user.update(some_field: 'something') # SELECT, , `company` `country`
また、このアプローチはデータベースの整合性を保証するものではないことにも注意してください。 リンクは後で問題なく(後続の要求または並列要求で)削除できます。
user.update(...) user.company.destroy! => , , , ( )
この問題を解決するには、対応する外部キー制約をデータベースに追加します。 この制限があるため、この接続が存在することを常に確認できます。
パフォーマンスはどうですか? データの整合性が(外部キー制約を使用して)維持されることが確実である場合に、データベースに対してSELECTクエリを作成する必要があるのはなぜですか?
答えは簡単です-必要はありません。 ただし、これを可能にするには、データベースにない接続を保存しようとしたときに発生するActiveRecord::InvalidForeignKey
例外の処理の問題を解決する必要があります。 これは、 errors
に同じエラーerrors
含まれるように、 belongs_to
と同じ動作をさせるために必要です。
すべての処理を自分で記述しないようにするには、 database_validations gemが役立ちます。 このgemにはすでに人々が気に入っている( ハブに投稿する ) validates_db_uniqueness_of
が含まれており、プロジェクトに非常に簡単に実装できるdb_belongs_to
があります。 db_belongs_to
はパフォーマンスを向上させ、データの整合性を確保します。
メソッドはいくつかのことを行います:
- アプリケーションの起動時に、データベースに正しい外部キー制約が存在するかどうかを確認します。
- データベースの例外を解析し、オブジェクトのエラーに対して適切なエラーを提供します。
- データベースに対して追加のSQLクエリを実行する必要がなくなります。
プロジェクトでdatabase_validationsを使用することをお勧めします。 このgemはすでに実稼働環境でテストされており、非常に優れていることが証明されています。 実装は簡単ですが、次のようにプロジェクトのパフォーマンスを大幅に改善できます。 使用すればするほど、保存量が増えます 。詳細については、 グループベンチマークをご覧ください。
フィードバックは大歓迎です! プロジェクトへの貢献に感謝します!