2016-05-24 10 views
0

Ich habe zwei Untermodelle, genannt: Service und Product, die von ProductBase erbt. Und ich habe ein anderes Modell, um es zu konsumieren. Acquire das viele AcquireBasket haben. Schauen Sie sich mein Code:Iterate über STI-Liste in Schienen 4

product_base.rb:

class ProductBase < ActiveRecord::Base 
    extend ::EnumerateIt 
    include Searchable 

    self.table_name = 'products' 
    end 

product.rb:

class Product < ProductBase 
    default_scope { where(kind: ProductKind::PRODUCT) } 

    def initialize(attributes = {}) 
     super(attributes) 
     self.kind = ProductKind::PRODUCT 
     self.status = ProductStatus::DRAFT 
    end 
    end 

service.rb:

class Service < ProductBase 
    default_scope { where(kind: ProductKind::SERVICE) } 

    def initialize(attributes = {}) 
     super(attributes) 
     self.kind = ProductKind::SERVICE 
     self.status = ProductStatus::DRAFT 
    end 
    end 

acquire_basket.rb:

class AcquireBasket < ActiveRecord::Base 
    extend ::EnumerateIt 

    belongs_to :acquire 
    belongs_to :product 
end 

In einem Teil meines Projekts bekomme ich eine Liste (erwerben Körbe) von beiden Modellen, Service und Product. Und ich muss überprüfen, ob ich darin Dienste habe.

Mein Code zu überprüfen war:

def services_in?(acquire) 
    acquire.baskets.map(&:product).detect(&:service?) 
end 

Der Code funktioniert nur, wenn ich Dienste passieren zuerst und Produkte nach !! Oder wenn ich nur einen von ihnen habe.

Antwort

0

Ich kann nicht die Antwort in Blog-Post auf der ganzen Welt finden, so dass ich mit Ihnen teilen:

class AcquireBasket < ActiveRecord::Base 
    extend ::EnumerateIt 

    belongs_to :acquire 
    belongs_to :product, class_name: 'ProductBase' 
end 

Das Problem war, wenn ich versuche, (träge) in einem Active zu finden :: Relation , Rails lookup (ich denke) nur Product Modell. Und es kann keine anderen Typenmodelle darin finden. Also benutze ich diesen Tippfehler, um es zur Arbeit zu bringen.

1

Sie sollten in der Lage sein, die descendents-Methode zu verwenden, um über alle Unterklassen

zu iterieren