私は次のモデルを持っています:
class Kueue < ActiveRecord::Base
attr_accessible :name, :user_id
belongs_to :user
has_and_belongs_to_many :photos
scope :empty, includes(:photos).where{ photos.id.eq(nil) }
scope :with_photos, includes(:photos).where{ photos.id.not_eq(nil) }
end
スコープが確実に機能するように、スコープの仕様を記述したいと思います。私の問題は、モデルをどのように扱うかPhoto
です。写真には多くの検証があります。たとえば、写真はに属している必要がありますUser
。したがって、これらのクエリの実用的な仕様を次のように書くことができます。
describe "queries" do
before :each do
@empty = Fabricate(:kueue)
@full = Kueue.new :name => "Full Queue"
@full.photos << Fabricate(:photo)
@full.save
end
it "should find empty queues" do
Kueue.empty.should_not include(@full)
end
it "should find queues with photos" do
Kueue.with_photos.should_not include(@empty)
end
end
ただし、ご想像のとおり、これは遅いです。これにより、データベースが大量に呼び出されます。(1)2つのキューを作成する、(2)写真を作成する、(3)写真を所有するユーザーを作成する...など。
これは簡単な問題のように思えます。必要なのは、写真とkueueの間の1つの結合レコードだけで、これを非常に高速にテストできます。では、この相互作用をどのようにモックして、より速く、より適切に分離してテストできるようにするのでしょうか。
PS:Rails 3.2.8、Squeel(したがってクエリ構文)を使用しています。QueueはRailsの予約語であるため、モデルはKueueと呼ばれます:)