2012-10-03 6 views
8

Mam następujący model w aplikacji RailsSzyny gdzie klauzula ponad dwa stoły

category => company => store 

Store ma belongs_to firmę i spółka ma związek belongs_to kategorii. teraz chcę użyć metody where w obiekcie sklepu, aby pobrać wszystkie sklepy w tej samej kategorii.

Chciałbym mieć coś takiego

@stores.nearbys(5).where("stores.company.category_id = xxx") 

może ktoś mi dać wskazówkę na temat tego

+0

@simone dzięki za zwrócenie kodu !!! – Martin

Odpowiedz

17

Try łączy z którym na połączonej tabeli:

@stores.nearbys(5).joins(:company).where("companies.category_id = xxx") 

EDIT:

Aby uzyskać kategorię sklepu ty najpierw będzie musiał przekazać metodę kategorii swojej firmie:

class Store < ActiveRecord::Base 
belongs_to :company 

delegate :category, :to => :company 
end 

Teraz wystarczy wywołać metodę w zapytaniu:

@stores.nearbys(5).joins(:company).where("companies.category_id = ?", self.company.id) 
+0

świetna! jeszcze jedno pytanie. jak mogę zastąpić xxx rzeczywistą kategorią sklepu, ponieważ jest on również dostępny za pośrednictwem powiązanej firmy? – Martin

+0

Edytowałem swoją odpowiedź - mam nadzieję, że będzie bardziej pomocne –

+0

dzięki. rozwiązał mój problem wraz z blogiem Simone. wszystko co najlepsze z Austrii – Martin

10

where obsługuje zagnieżdżone hash.

@stores.nearbys(5).where(:company => { :category_id => @category.id }, joins: company) 
+0

hi simone, z @ store.nearbys (5) .where (firma: {category_id}, join: company) pojawia się następujący błąd - błąd składniowy, nieoczekiwany "}", oczekujący tASSOC .... where (firma: { category_id}, dołącza: firma) – Martin

+0

Może nie używasz Ruby 1.9? Zaktualizowałem, aby użyć starej składni. –

+0

Niestety wystąpił błąd. Zapomniałem, że "category_id" musi mieć wartość, w tym przypadku '@ category.id' (pamiętaj, aby dostosować kod) –

-1

można spróbować tego

@category = Category.find xxx 

@store = @category.company.stores 
+0

to naprawdę nie jest opcja, ponieważ mam istniejący obiekt sklepu i chcę uzyskać wszystkie sklepy, które są w tej samej kategorii ... – Martin

+0

możemy mieć inną relację, jeśli to możliwe jak w sklepach należy do: kategorii,: through =>: firma –