Mongoid API では MongoDB の $sample 操作が表示されないため、Mongo ドライバーを使用して手動でクエリを実行する必要があり、その結果をどう処理すればよいかわかりません。
いくつかの共通インターフェイスに準拠するさまざまなクラス/コレクションがあり (いくつかの理由で継承を使用したくありませんでした)、それらを単一のコレクションとしてレンダリングしようとしています。これら3つのクラスからサンプリングするコードがあります
entries = [Class1, Class2, Class3].inject([]) do |array, clazz|
entries << clazz.collection.aggregate([ { '$sample': { size: 10 } } ])
end
これにより、3 つの異なる の配列が得られますMongo::Collection::View::Aggregation
。どういうわけかそれらをマージしてオブジェクトをインスタンス化できるようにしたいので、ビューでそれらを使用できます(たとえば、セルを使用)
<%= cell(:profile, collection: entries) %>
を使用entries.to_a
すると、(モデル) オブジェクトの配列ではなく、ハッシュの配列が返されます。私はそれが事実であり、セルビルダーを使用してモデル間の残りの微妙な違いを処理することを望んでいました
builds do |model, options|
case model
when Class1; Class1Cell
when Class2; Class2Cell
when Class3; Class3Cell
end
編集 :
私は実際にto_a
キー_type
を使用して、対応する定数/モデルを見つけることができます。さて、ニュートの質問は、ハッシュを使用してモデルをインスタンス化する方法です。これは返さtrue
れませんnew_record?
sample = entries.to_a.first
instance = Utility.resolve_class(sample[:_type]).new(entry_hash)
# Problem is...
instance.new_record? # => returns true, but since it comes from the DB it means it has already been persisted so it should return false.