2011-07-17 10 views
5

beni işaret olabilir. Katılma iç içe dernekler, çoklu seviye sql iyi, ben bazı iyi bilgi arıyorum raylar biliyor ve o sizin için

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 

Bir kullanıcı için bir olayın emir toplamak istediğiniz, aşağıdaki gibi http://guides.rubyonrails.org/active_record_querying.html#using-array-hash-of-named-associations

Benim modelleri (kısaltılır) vardır - My sorgu bu bölümde 'katılan İçiçe Dernekler örneğe çok benzer (satıcı), ve işte en iyi çatlağım.

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 

Bu katılım nasıl görünmeli?

ben papatya zinciri üzerinde çeşitli modellerde kapsamları içine bu kadar verelim mi?

Sadece burada temel bir anlayışa sahip olduğunu göstermek için, benim hemen almaya başladık benim ilk tablo kırmak için

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

cevap

0

Fikrin (Bu başarı beni heyecanlandırdı) gidiş katılmak iç içe çalışan Bu kapsamları iyi. Ama herhangi bir ilişkili modeli diğer modellerden kapsamları içinde birleştirebilirsiniz çünkü -Sandığın kadar papatya zinciri olmayabilir. İşte bu harika şeyi mümkün kılan AREL # birleştirme ile ilgili harika bir yazı: http://ben.hoskings.net/2012-07-04-arel-merge-a-hidden-gem

Bu şekilde, düşüncenizi daha küçük parçalara ayırabilirsiniz. Bu nedenle, Post ile başlayın ve bir kullanıcı verilen tüm ilişkili ürünleri alan bir kapsam oluşturun. Sonra bir kapsam oluşturmanız zincirler size bir etkinlik verilen tüm mesajları alır biri üzerine o kapsamı. Ardından, bu kapsamı Kullanıcı kapsamınıza dahil edin.

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) } 

Burada doğru yolda olduğumdan emin değilim. Test edemem ... ama belki bu başlamanıza neden olabilir. Fikir yönetilebilir parçalar haline sorumlulukları kırmak ve AREL çılgın SQL birleştirme işi yapmak izin vermektir.

İlgili konular