2012-04-03 17 views
11

belongs_toリレーションに含まれている関連ユーザー名でレコードを検索しようとしていますが、機能しません。rails mongoid criteriaアソシエーション別検索

記事は ユーザーは正常に動作しますが、私は、ユーザーテーブルに格納される基準としてユーザー名を使用したいArticle.where(user_id: someid)多くの記事

を持つユーザーに属しています。

Article.includes(:user).where(:username => "erebus") 
Article.includes(:user).where("user.username" => "erebus") 

私も

が動作しないidentity_map_enabled: true

Article.includes(:user).inclusionsリターン関係の詳細を持って、私は何を理解していないのですか?

答えて

27

mongodbには結合がないことに注意する必要があります。リレーショナルDBでは、includesが結合クエリを形成し、クエリの両方のテーブルのカラムを使用できます。しかし、mongodbに結合がないため、同じことはできません。

mongoidでは、includesはdbコールの束を保存するだけです。関連するレコードをフェッチしてアイデンティティ・マップに格納して高速で検索できますが、依然として問合せ中には1つの問合せで1つのコレクションしか処理できません。

ユーザー名に基づいた記事が必要な場合は、私の周りに、以下の作業をお勧めします:

user_ids = User.where(username: 'erebus').only(:_id).map(&:_id) 
articles = Article.where(:user_id.in => user_ids) 
+0

他の方法でデータを取得した場合、実際には現在のコレクションには配列は存在しませんが、 1 ? – Laurent

+0

ああ私は答えを知っている:あなたはできない。 – Laurent

13

あなたは何rubishから、それは少し短くすることができますが示唆さ:

user_ids = User.where(username: 'erebus').pluck(:id) 
articles = Article.where(:user_id.in => user_ids) 

または1つのライナー:

articles = Article.where(:user_id.in => User.where(username: 'erebus').pluck(:id)) 
+0

マップ機能を持たない1つのライナーが大好き – HoosierCoder