2012-04-03 11 views
11

Próbuję znaleźć rekord przez skojarzoną nazwę użytkownika, która jest zawarta w relacji belongs_to, ale nie działa.Kryteria wyszukiwania kryteriów rgo znaleźć przez skojarzenie

Artykuły należą do użytkowników Użytkownicy mają wiele artykułów

Article.where(user_id: someid) działa dobrze, ale chciałbym użyć nazwy użytkownika jako punkt odniesienia, który jest przechowywany w tabeli użytkowników.

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

Mam też identity_map_enabled: true

Article.includes(:user).inclusions zwraca szczegóły powiązanie

Nie działa, co ja nie rozumiejąc?

Odpowiedz

27

Należy pamiętać, że w mongodb nie ma złączeń. W relacyjnym rejestrze dbs includes tworzy zapytanie o łączenie i można użyć kolumn z obu zapytań. Jednak ze względu na brak sprzężeń w mongodb, to samo nie jest możliwe.

W mongoid, includes po prostu zapisuje kilka wywołań db. Pobiera i przechowuje powiązane rekordy w mapie tożsamości w celu szybkiego pobrania, ale wciąż podczas odpytywania jedno zapytanie może dotyczyć tylko jednej kolekcji.

Jeśli potrzebujesz artykuły na podstawie nazwy użytkownika, proponuję następujące prace wokół:

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

co, jeśli otrzymamy dane z innej strony iw rzeczywistości nie ma tablicy w bieżącym zbiorze, ale inne jeden? – Laurent

+0

o tak, znam odpowiedź: nie możesz. – Laurent

13

Można zrobić to nieco krótsza od jakiego rubish zasugerował:

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

lub jeden liner:

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

Uwielbiam jedną linijkę bez funkcji mapy – HoosierCoder

Powiązane problemy