2016-05-24 2 views
0

У меня есть две подмодельные модели: Service и Product, которая наследуется от ProductBase. И у меня есть другая модель, чтобы потреблять ее. Acquire которые есть много AcquireBasket. Проверьте мой код:Итерация над списком STI в рельсах 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 

В какой-то части моего проекта я получаю список (приобретаю корзины) обеих моделей, Service и Product. И мне нужно проверить, есть ли у меня сервисы внутри него.

Мой код проверки был:

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

код работает, только если я прохожу услуги первой и продукты после !! Или, если у меня есть только один из них.

ответ

0

Я не могу найти ответ в блоге по всему миру, так что я поделюсь с вами:

class AcquireBasket < ActiveRecord::Base 
    extend ::EnumerateIt 

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

Проблема заключалась в том, когда я пытаюсь найти (лениво) в ActiveRecord :: Отношения , Rails поиск (я думаю) только Product модель. И он не может найти в нем другие модели. Поэтому, используя эту опечатку, я включил ее в работу.

1

Вы должны иметь возможность использовать метод descendents для итерации по всем подклассам

Смежные вопросы