2010-11-24 4 views
1

1)インスタンスオブジェクトによる検索モンゴイ文法の質問

私は@topicというインスタンスオブジェクトがあるとします。私はこのトピックの答えを検索したい。私は渡すことができるはずだと思っていた:topics => @ topicしかし、私は以下の非常に醜い質問をしなければならなかった。

@answers = Answers.where(:topic_ids => {"$in" => [@topic.id]}) 

2)idの文字列表現を取得しています。私はカスタム関数を持っています(下記参照)。しかし、これは非常に共通の要件ではないでしょうか?あなたのアソシエーションが正しく設定されている場合

def sid 
    return id.to_s 
    end 

答えて

2

、あなたが行うことができる必要があります:それは上記のように聞こえる

@topic.answers 

あなたが探しているものです。あなたのアソシエーションが正しく設定されていることを確認してください。 Mongoidは関連を定義するときにとても寛容ですので、実際にはreferences_manyreferenced_inという名前の不一致のような問題があったときに設定されているように見えます。

上記動作しません、あなたは、クエリを使用する必要がなぜ、あなたはこの単純なクエリを使用することができます正当な理由がある場合:

@answers = Answer.where(:topic_ids => @topic.id) 

をこれがtopic_ids提供されたIDを含むすべてのAnswerレコードと一致しますが。構文は配列フィールドの場合と同じですが、単一値フィールドの場合はAnswer.where(:title => 'Foo')のようになります。 MongoDBは、フィールドが配列かどうか(指定された値が配列内にあるかどうかをチェックする)、または単一の値(指定された値が一致するかどうかをチェックする)によって異なるかどうかを解釈します。ここで

はMongoDBのは、アレイのクエリを処理する方法についてもう少し詳細です: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

+0

うーん、あなたが与えた例が動作するようには思えない - 私は何も悪いことをやっていますか? @answers = @ user.answers.where(:topic_ids.in => @ topic.id) –

+0

申し訳ありませんが、私は間違った道を導いた。このタイプのクエリには '$ in'演算子(または' .in' Mongoid Symbol拡張子)を使うべきではありません。更新された回答をご覧ください。 – bowsersenior