2011-06-23 10 views
4

シンプルモデル:Mongoid、references_oneアソシエーション(およびそれ以降のアソシエーション)を介してorder_byする方法は?

class hat 
    embedded_in :owner 
    field :color 
end 

class owner 
    embedds_one :hat 
    referenced_in :house 
    field :name 
end 

class house 
    references_one :owner 
    field :number 
end 

だから単に置く、我々は所有者に関連付けられている家のコレクションを持っている、と所有者が色の帽子を持つことができます。

私は単に彼らの数で家を並べ替えることができます。

House.all.order_by([[ :number, :asc ]]) 

しかし、私が欲しいのは、理想的に私が書きたい、その所有者の名前で、家を注文されています

House.all.order_by([[ :'owner.name', :asc ]]) 

しかし、それは動作しません...

また、私は所有者の帽子の色で家を並べ替えることができるようにしたい

House.all.order_by([[ :'owner.hat.color', :asc ]]) 

私は、可能であれば、すべてを書き換えることなく、これを達成することができますどのように任意のアイデアが:)

おかげ

アレックス

答えて

3

ドット表記のみが埋め込まれた文書は可能ですが、2つのコレクションがある - 住宅と所有者。 MongoDBの所有者レコードの1つでは、ハウスレコードの1つにフィールドhouse_idしかありません。所有者モデルへの接続はありません。 唯一の方法は、すべての住宅をフェッチし、Enumerable#sortを使用して達成されたコレクションをソートすることです。

+0

私はよくそれは私が非正規化するデータを持っており、中に帽子の色をコピーします:)私のシステムでは、私のために可能であるには余りにも多くの家をつもりはない、見ます私の家...私は、私の帽子の色が最新のものではないという結果を残す必要があります... – Alex

+0

別のコレクションに家主を保管する必要がありますか?住宅に埋め込まれたオーナーやオーナーに埋め込まれた帽子を保管することができます。 – Hck

2

これを行う方法は次のようになります。 - ハウス文書に文字列として所有者名を埋め込みます。 ハウスオブジェクトにはowner_id(所有者のドキュメント全体を取得できるように)と所有者名だけの余分なフィールドの両方がstringとして存在します。 owner_idを変更する場合にのみ名前を変更する必要があります。これは、一貫性を保つために1つの更新で行うことができます。 これは非常に効率的なクエリになります。なぜなら、コレクションとドキュメントを読み込みする必要がないからです。 欠点はもう少しmemが使用されています。

  • 所有者がオーナーであるため、所有者オブジェクトに参照を持たせてください。 次に、名前でソートされた所有者を照会し、正しい順序で取得する参照元文書をフェッチすることができます。 これは多くの個別のクエリを実行することの欠点があります。

  • 1つの極端な解決策は、すべてのそれらのドキュメントを埋め込むことです:帽子の中の帽子、所有者の家の中の帽子。

最高、 AG

+0

私は解決策1にかなり行きました – Alex

関連する問題