13

Django では、ORM にはget()、モデルの単一のインスタンスのみを返すために使用される関数が呼び出されます。具体的には、1 つだけを期待していたときに複数のオブジェクトが返された場合に例外が発生するため、特定のルックアップ (つまり、「このスラッグで 1 つの記事を見つける」) に最適です。

Rails/ActiveRecord で同じ動作をする類似の関数を見つけることができませんでした。これまでのところ、次のようなコードを書いています。

Model.where( ... ).first

しかし、これにより、オブジェクトの複数のインスタンスが返されるというサイレント バグが発生しました。これは、非常に悪い、あいまいな状況です。

Active Record Query Interface ガイドには、単一のオブジェクトを取得する 5 つの方法がリストされており、最も有望な方法find()find_by()探していますが、複数のオブジェクトが検索条件に一致する場合、いずれの方法も例外を発生させません。

where()自分で記述してクエリを実行し、返されたオブジェクトの数を確認するだけでよいことはわかっていfind_by()ますが、このコードはコードベースのいたるところに表示され、そのような面倒なことはすべて追加したくありません。また、これが Rails/ActiveRecord のどこかに組み込まれることを期待するような一般的で一般的なニーズのようにも思えます。

これらの状況を見つけやすくするために欠けている機能はありますか? Rails 4 と Ruby 2.0 が役立つ場合は、それを使用しています。

4

2 に答える 2

2

あなたが求めていることを実行する組み込みの Active Record メソッドについては知りませんが、独自のメソッドを作成するのは難しくありません。何かのようなもの:

class YourModel
  def self.find_only_one_by_slug(slug)
    results = YourModel.where(slug: slug)
    if results.size > 1
      raise "There should only be one return value."
    else
      return results.first
    end
  end
end

上記のコードをテストしていないため、間違いなくエラーが発生しますが、アイデアはわかります。これをさらに一歩進めて、すべてのモデルがアクセスできるアクティブなレコード ベースに同様のメソッドを追加することもできます。

于 2013-11-05T17:39:25.373 に答える