2011-07-17 15 views
5

Dla tych z was, którzy dobrze znają szyny i sql, szukam dobrych informacji, które moglibyście wskazać. Moje zapytanie jest bardzo podobny do przykładu z "Łączenie zagnieżdżonych stowarzyszeń w tej sekcji - http://guides.rubyonrails.org/active_record_querying.html#using-array-hash-of-named-associationsŁączenie asocjacji zagnieżdżonych, wielopoziomowe

Moje modele (w skrócie) są następujące

User has_many :products # User is 'great-grandparent' 
Product has_many :posts # Product is grandparent #1 
Event has_many :posts  # Event is grandparent #2 
Post belongs_to :event 
Post belongs_to :product 
Post has_many :orders  # Post is parent 
Order belongs_to :post  # Order is great-grandchild, grandchild, & child 

chcę zbierać zamówienia od zdarzenia dla użytkownika (sprzedawca), a oto moje najlepsze rozwiązanie.

class Order < ActiveRecord::Base 
    def self.collect_for_seller_and_event(user_id, event_id) 
    self.joins(:post => [{:product => :user }, :event]).where(:post => [{:product => {:user_id => user_id}}, {:event_id => event_id}]) 
    end 

Jak powinno wyglądać to połączenie?

Czy powinienem podzielić to na zakresy w różnych modelach w łańcuchu?

Wystarczy pokazać, że mam podstawową wiedzę na temat tutaj, byłem w stanie dostać mój pierwszy pracę zagnieżdżona tabela zamiar przyłączyć (Jestem bardzo podekscytowany tym urzeczywistnienia)

BuyerFeedback 
belongs_to :order 
def self.from_past_events 
    self.joins(:order => {:post => :event}).where(:order => {:post => {:event => {:date.lt => Date.today}}}) 
end 

Odpowiedz

0

Twój pomysł, aby przerwać to do zakresu jest dobre. Ale może nie musisz łączyć się tak długo, jak myślisz, ponieważ możesz scalać zakresy z innych modeli do dowolnego skojarzonego modelu. Oto świetny artykuł na temat ARel # merge, który umożliwia tę cudowną rzecz: http://ben.hoskings.net/2012-07-04-arel-merge-a-hidden-gem

W ten sposób możesz podzielić swoje myślenie na mniejsze części. Zacznij więc od Post i stwórz zakres, dzięki któremu uzyskasz wszystkie powiązane produkty podane użytkownikowi. Następnie utwórz zakres, który łączy ten zakres na taki, który zawiera wszystkie posty z danego zdarzenia. Następnie po prostu połącz ten zakres ze swoim zasięgiem Użytkownika.

Product 
    scope :for_user, ->(user) { where(user_id: user) } # The passed in `user` can be an instance of user or an id 

Post 
    scope :for_product, ->(product) { where(product_id: product) } 
    scope :for_product_given_user, ->(product, user) { for_product(product).merge(Product.for_user(user)) } 
    scope :for_product_given_user_and_event, ->(product, user, event) { for_product_given_user(product, user).where(event_id: event) } 

Nie jestem pewien, czy jestem na dobrej drodze, biorąc pod uwagę, że nie mogę tego przetestować ... ale może to pomoże ci zacząć. Chodzi o to, aby podzielić obowiązki na łatwe do opanowania części i pozwolić ARelowi na szalone działanie SQL Merge.

Powiązane problemy