2012-04-03 4 views
11

Ich versuche, einen Datensatz von zugeordneten Benutzernamen zu finden, die in einer Beziehung gehört gehört, aber es funktioniert nicht.rails mongoid Kriterien finden durch Zuordnung

Artikel gehören zu Benutzer Benutzer

Article.where(user_id: someid) funktioniert viele Artikel haben, aber ich möchte den Benutzernamen als Referenz verwenden, die in der Tabelle Benutzer gespeichert ist.

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

Ich habe auch identity_map_enabled: true

Article.includes(:user).inclusions die Beziehung Details gibt

Geht nicht, was soll ich nicht verstehen?

Antwort

27

Sie müssen daran denken, dass es keine Verbindungen in mongodb gibt. In relationalen dbs bildet includes eine Join-Abfrage und Sie können Spalten aus beiden Tabellen in der Abfrage verwenden. Aufgrund der fehlenden Verbindungen in Mongodb ist dies jedoch nicht möglich.

In Mongoid, speichert includes nur eine Reihe von DB-Aufrufe. Es ruft die zugehörigen Datensätze in der Identitätskarte ab und speichert sie für den schnellen Abruf, aber während der Abfrage kann eine Abfrage nur mit einer Sammlung arbeiten.

Wenn Sie Artikel benötigen, basierend auf Benutzernamen, würde ich folgende Arbeiten legen nahe, um:

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

Was ist, wenn wir die Daten von der anderen Seite bekommen und es gibt tatsächlich kein Array in der aktuellen Sammlung, aber das andere ein ? – Laurent

+0

oh ja ich kenne die antwort: du kannst nicht. – Laurent

13

Sie können es aus dem, was rubish etwas kürzer machen vorgeschlagen:

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

Oder Motto:

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

Liebe den One Liner auch ohne die Kartenfunktion – HoosierCoder

Verwandte Themen