1

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.
4

3 に答える 3

1

Cells はどの PORO でも動作します。したがって、目的を達成する最も簡単な方法は、モデル ファイル内に必要なデータを表すクラスを作成することです。これを単純な Ruby クラスとして作成するだけです。集計を作成し、一連のクラスをクラス メソッドとして返すためのデータ クエリ メソッドを非表示にすることができます。

次のようなものです (これを整理する必要があります。これは、開始するための単なるハックです):

# some PORO
class Record
   attr_accessor :field_1, :field_2, :field_3

   def self.build
       # your existing code
       entries = [Class1, Class2, Class3].inject([]) do |array, clazz|
        entries << profile_collection.collection.aggregate([ { '$sample': { size: 10 } } ])    
       end

       array_of_objects = []

       # now for each record within the aggregate create an object
       entries.each do |obj|
          new_poro = self.new
          obj.keys.each do |key|
             new_poro.self.instance_variable_set(key, obj[key])
          end
          array_of_objects.push new_poro
       end  
       return array_of_objects 
    end
end


# to run it in your controller
@records_in_objects_for_cells = Record.build

# in your views
<%= cell(:record, collection: records_in_objects_for_cells %>
于 2016-04-18T21:33:54.833 に答える