2010-12-15 4 views
6

Mam dwa modele User i Event. Liczność to jeden użytkownik ma wiele zdarzeń. Kiedy wysyłam zapytanie do bazy danych, aby dać mi wszystkich użytkowników i odpowiadające im zdarzenia, zwraca właściwe wyniki. Przykładowa instrukcja: Users.find (: all,: include => [: events])Ruby on Rails - Dodaj warunek na ': include =>', aby załadować ograniczoną liczbę obiektów

Jednak potrzebuję pomocy w uzyskaniu zdarzeń dla użytkownika na podstawie warunku. Potrzebuję każdego użytkownika, który wrócił, by otrzymać tylko wydarzenia zaplanowane na dziś (np. CREATED_DATE = TODAY). To znaczy, nie chcę wszystkich zdarzeń powiązanych z użytkownikami. Powiedział, że nadal potrzebuję wszystkich użytkowników znalezionych w bazie danych, ale niektórzy z tych użytkowników, którzy nie mają zaplanowanego wydarzenia na dziś, nie powinni mieć zdarzenia załadowanego na mapę haszującą.

Czy ktoś może mi pomóc w modyfikowaniu "Users.find (: all,: include => [: events])" Rails statement, dzięki czemu mogę uzyskać tylko niektóre Wydarzenia dla Użytkowników, a nie wszystkie Wydarzenia?

Dzięki S

Odpowiedz

1

do mojej wiedzy, nie można użyć opcji: include w sposób opisać.

Jaki jest twój problem z uzyskaniem wszystkich wydarzeń? Będziesz musiał jednak wczytać/dołączyć/zapytać tabelę zdarzeń. Będziesz potrzebował więcej pamięci, jeśli zainicjujesz wszystkie zdarzenia.

Oczywiście można wykonać dwa zapytania, jeden dla użytkowników z wydarzeniami "dzisiaj" i jeden dla osób bez.

Można także udać się na odwrót:

Event.find(:all, :conditions => "...only today...", :include => :user) 

co dałoby Ci wszystkie zdarzenia na dzisiaj z użytkowników włączone. Możesz użyć innego zapytania, aby uzyskać wszystkich użytkowników bez uwzględniania zdarzeń, a resztę w pamięci.

+2

Pracuję z obiektami użytkownika, w jaki sposób mogę odwrócić obiekty, aby zdarzenia były zawarte w użytkownikach, a nie zdarzenia zawierające użytkowników, jak zasugerowano w powyższym stwierdzeniu ? Jeśli mogę łatwo (wymaga to mniejszej liczby operacji), to rozwiązanie może działać. :) – partizan

+0

Ale to nadal nie zwróci żadnych użytkowników, którzy nie mają zdarzeń. – lala

6

Coś wzdłuż tych linii powinno działać:

# Rails 3 
User.includes(:events).where(:events => {:created_at => Time.now.midnight..Time.now.tomorrow.midnight}) 

# Rails 2 
User.find(:all, :includes => :events, :conditions => ["events.created_at between ? and ?", Time.now.midnight, Time.now.tomorrow.midnight]) 

Time.now.tomorrow.midnight jest dość nieprzyjemny. 1.day.from_now.midnight może być nieco mniej nieprzyjemny, w zależności od twoich preferencji;)

+3

Dzięki idlefingerom za sugestię, ale nie sądzę, że będzie działać w oparciu o to, co próbuję zrobić. Zapytanie nie zwróci użytkowników, którzy nie mają zdarzeń, ale tylko użytkownicy, którzy to robią. Dla mojego problemu chcę, aby wszyscy użytkownicy, ale niektórzy również będą mieli Wydarzenia (jeśli ich wydarzenie jest zaplanowane na dziś). – partizan

+0

Pomyślałem, że uwzględnilibyśmy użytkowników bez zdarzeń, ponieważ używanie włączania zwykle powoduje dwa zapytania, aby z łatwością wczytać skojarzenia. Wydaje się, że arel zamienia go w lewe sprzężenie zewnętrzne, gdy wprowadzisz klauzul where do miksu, co wyjaśnia, dlaczego powracają tylko użytkownicy, którzy mają zdarzenia. 'User.joins (: events) .where (jak wyżej)' tworzy właściwe zapytanie (używając wewnętrznego sprzężenia), ale nie wydaje się, aby ładnie ładować artykuły. Hmm. – idlefingers