2017-07-17 1 views
0

私はDepartmentと呼ばれるモンゴイドモデルと別のモデルUserと呼ばれ、2つのモデルの間にはネイティブの関係はありません。私のアプリケーションの関係がどのように働くかによって、私はドキュメントIDをUserモデルに手動で格納します。この方法は、代わりにRubyの配列を返すためモンゴイドのクエリから構築されたRuby配列を実際のモンゴイドオブジェクトに変換するか、モンゴイドオブジェクトを返すように書き直しますか?

、私はRuby用のGrapeフレームワークを使用しています、そして、それはEntitiesと呼ばれるMongoidオブジェクトの上に座ってフィルタシステムを持っており、それがmongoidクエリ応答オブジェクトをイマイチ何を拒否しますモンゴイドオブジェクト、私のフレームワークは私にエラーを与える。

モンゴイドオブジェクトを返すために私の関数を書き直す方法はありますか?またはMongoidオブジェクトの配列を1つのMongoidオブジェクトに変換できる方法がありますか?

私は信じ
## inside Department Model 
def self.user_can_access(user = nil) 
    if user != nil 
    departments = [] 
    ## department_access_keys are embedded documents belonging to a user 
    user.department_access_keys.each do |key| 
     departments << BACKBONE::Department.find(key.key) 
    end 
    departments ## => returns an array of Department Documents that a user has been granted access to 
    else 
    raise 'user was not defined' 
    end 
end 

答えて

0

あなたはちょうどこのようfindを使用することはできません?

departments = BACKBONE::Department.find(*user.department_access_keys.map(&:key)) 

私はmongoidに精通していないですが、Documentationが、これはあなたが望むものを達成するために正確にどのようにあることを示唆しているようです。

基準#find idでドキュメントまたは複数のドキュメントを検索します。いずれかのIDが一致しない場合、デフォルトでエラーが発生します。

例:

Band.find("4baa56f1230048567300485c") 
Band.find(
    "4baa56f1230048567300485c", 
    "4baa56f1230048567300485d" 
) 
Band.where(name: "Photek").find(
    "4baa56f1230048567300485c" 
) 
+0

はあなたに感謝します!なぜ私はブドウの実体が配列を受け入れないのか分かりませんが、これは私の問題を解決しました! – aronlmin

2

、「Mongoidオブジェクトは」ただハッシュする必要がありますので、この作業をする必要があります(また、Enumerable.mapの代わりphpish each { << }に注意してください):

## inside Department Model 
def self.user_can_access(user = nil) 
    raise 'user was not defined' if user.nil? 

    { 
    departments: # return hash here 
     user.department_access_keys.map do |key| 
     BACKBONE::Department.find(key.key) 
     end 
    } 
end 
関連する問題