belongs_toを2倍の速度で動作するようにアップグレードする方法(database_validations gem)

この記事では、通常の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



はパフォーマンスを向上させ、データの整合性を確保します。







メソッドはいくつかのことを行います:









プロジェクトでdatabase_validationsを使用することをお勧めします。 このgemはすでに実稼働環境でテストされており、非常に優れていることが証明されています。 実装は簡単ですが、次のようにプロジェクトのパフォーマンスを大幅に改善できます。 使用すればするほど、保存量が増えます 。詳細については、 グループベンチマークをご覧ください。







フィードバックは大歓迎です! プロジェクトへの貢献に感謝します!








All Articles