2016-05-18 6 views
0

私はRailsの中に名前空間を持つビットのトラブルを抱えているが、既存のと同じクラス、およびOrderItemRailsの名前空間4.</p> <p>私はActiveRecordのモデル<code>Shop</code>、<code>Order</code>を持ってactive_recordモデル

# model/shop.rb 
class Shop < ActiveRecord::Base 

# model/order.rb 
class Order < ActiveRecord::Base 
    has_many :order_items 

# model/order_item.rb 
class OrderItem < ActiveRecord::Base 
    belongs_to :orderable, polymorphic: true 
    belongs_to :order 

私は複製していますこの

# model/shop/order.rb 
class Shop::Order 
    attr_accessor :order_items 
    def initialize 
    self.order_items = [] 
    self.order_items << Shop::OrderItem.new 
    end 

# model/shop/order_item.rb 
class Shop::OrderItem 
    attr_accessor :orderable_type, :orderable_id 

    def initialize(params = {}) 
    if params 
     self.orderable_type = params['orderable_type'] if params['orderable_type'] 
     self.orderable_id = params['orderable_id'] if params['orderable_id'] 
    end 
    end 

    def price 
    orderable.price 
    end 

    def orderable 
    orderable_type.constantize.find_by(id: orderable_id) 
    end 

    def to_h 
    Hash[ 
     orderable_type: self.orderable_type, 
     orderable_id: self.orderable_id, 
     price: self.price 
    ] 
    end 

end 

のような名前空間のOrderOrderItemとの関係だから私の問題は、私がShop::Order.newを初期化するとき、はShop::OrderItemの代わりにOrderItemの配列であり、コントローラーでテストするとShop::OrderItemと入力すると、OrderItemが返されます。

OrderItemより前にShop::OrderItemが初期化されていないのではないかと疑問に思っています。

+0

「Shop :: OrderItem」をもう少し見てみましょう。 – jvillian

+2

また、好奇心のために、なぜあなたはこれをやっていますか? – jvillian

+0

@jvillianさんがコードを追加しました。私は情報を保持するためにactive_recordのものを使用したくないので、名前空間はチェックアウト前にショッピング情報を保持するためにそこにあるので、チェックアウトすると、名前空間1から情報をactive_recordに転送してデータベースに保存する – lusketeer

答えて

1

名前空間の衝突が発生しています。コードが実行されている場所によっては、models/shop.rbで定義したActiveRecordモデル、またはの下に定義したモジュールの名前空間にすることができます。これは予期せぬ実行を引き起こすだけでなく、読むことも混乱します。

「ショップ」以外のモジュールネームスペースの使用をお勧めします。それを「MyShop」と呼んでさえ改善するだろう。しかし、あなたはおそらくまだShopMyShop::Shopの間の名前の衝突にぶつかるでしょう。おそらく、これを回避するためにMyShopモジュールの下にショップクラスの名前を変更する必要があります。たとえば

# model/my_shop/my_order.rb 
class MyShop::MyOrder 
    # ... 
end 
# model/my_shop/my_order_item.rb 
class MyShop::MyOrderItem 
    # ... 
end 

は、私はあなたを傷つけるの世界を自分で設定しているように感じる、すべてのことを言いました。この問題は、サービスオブジェクトを使用して解決するほうがよい場合があります。本当に良い例はGoogleの「Rails Service Objects」です。

+0

https://blog.engineyard.com/2014/keeping-your-rails-controllers-dry-with-servicesとhttp://brewhouse.io/blog/2014/04/30/gourmet-service-objects.htmlサービスオブジェクトのかなり良い例です。 – mysmallidea

+0

クール、私は見てみましょう。私はクラスの名前を変更するだけで終わりました。名前を変更せずにこれを解決する方法を見つけることを望んでいました。これまでのところ解決策はありません。ありがとう – lusketeer

関連する問題

 関連する問題