2016-05-24 5 views
0

ServiceProductという2つのサブモデルがあり、ProductBaseを継承しています。そして私はそれを消費する別のモデルを持っています。多くのAcquireBasketを持つAcquireです。私のコードをチェックアウト:レールでSTIリストを反復する

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 

私のプロジェクトの一部では、両方のモデルのリスト(バスケットを取得)、ServiceProductを取得します。そして、私はそれの中にサービスがあるかどうかを確認する必要があります。チェックする

私のコードはでした:

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

コード作品、私は後の最初のサービス、製品を渡す場合にのみ!または、私がそれらの1つしか持っていない場合。

答えて

0

私は、世界中のブログ記事で答えを見つけることができないので、私はあなたと共有します:

class AcquireBasket < ActiveRecord::Base 
    extend ::EnumerateIt 

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

問題をして、私はActiveRecordの中で(なまけ)探してみてください::関係、ルックアップ(私は思う)Productモデルにちょうど参照してください。そして、それの中に他のタイプのモデルを見つけることはできません。だからこのタイプミスを使って私はそれを動作させました。

1

descendentsメソッドを使用して、すべてのサブクラスを反復処理することができます。