2015-07-11 37 views
1

我在我的應用程序中使用單表繼承,並且在我的開發環境中一切工作正常時有很多實例。但是,當我釋放到生產(使用客運)我得到以下錯誤:活動記錄回調拋出「未定義的方法」錯誤在使用STI的類生產中

undefined method `before_save' for InventoryOrder:Class (NoMethodError)

爲什麼會這樣工作在我的開發環境,而不是在生產工作?兩者都使用Rails 4.2和Ruby 2.1.5。這可能是乘客的問題嗎?

這裏是InventoryOrder類:

class InventoryOrder < Order 

    def self.model_name 
     Order.model_name 
    end 

    before_save :ensure_only_feed_types 

    def ensure_only_feed_types 
     order_products.each do |op| 
      if !ProductTypes::is_mix?(op.product_type.type) 
       raise Exceptions::FailedValidations, _("Can't have an inventory order for anything but mixes") 
      end 
     end 
    end 

    def self.check_if_replenishment_order_is_needed(product_type_id) 

     prod_type = ProductType.find(product_type_id) 

     return if prod_type.nil? || prod_type.min_system_should_have_on_hand.nil? || prod_type.min_system_should_have_on_hand == 0     

     amount_free = Inventory::inventory_free_for_type(product_type_id) 

     if prod_type.min_system_should_have_on_hand > amount_free 
      if prod_type.is_mix? 
       InventoryOrder::create_replenishment_order(product_type_id, prod_type.min_system_should_have_on_hand - amount_free) 
      else 
       OrderMoreNotification.create({subject: "Running low on #{prod_type.name}", body: "Should have #{prod_type.min_system_should_have_on_hand} of unreserved #{prod_type.name} but only #{amount_free} is left"}) 
      end 
     end 

    end 

    def self.create_replenishment_order(product_type_id, amount) 

     # first check for current inventory orders 
     orders = InventoryOrder.joins(:order_products).where("order_products.product_type_id = ? and status <> ? and status <> ?", product_type_id, OrderStatuses::ready[:id], OrderStatuses::completed[:id]) 

     amount_in_current_orders = orders.map {|o| o.order_products.map {|op| op.amount }.sum }.sum 
     amount_left_to_add = amount - amount_in_current_orders 

     if amount_left_to_add > 0 
      InventoryOrder.create({pickup_time: 3.days.from_now, location_id: Location::get_default_location.id, order_products: [OrderProduct.new({product_type_id: product_type_id, amount: amount_left_to_add})]}) 
     end  

    end 

    def self.create_order_from_cancelled_order_product(order_product) 
     InventoryOrder.create({ 
      pickup_time: DateTime.now.change({ min: 0, sec: 0 }) + 1.days, 
      location_id: Location::get_default_location.id, 
      order_products: [OrderProduct.new({ 
       product_type_id: order_product.product_type_id, 
       feed_mill_job_id: order_product.feed_mill_job_id, 
       ration_id: order_product.ration_id, 
       amount: order_product.amount 
       })], 
      description: "Client Order for #{order_product.amount}kg of #{order_product.product_type.name} was cancelled after the feed mill job started." 
     }) 
    end 

end 

這裏是它的父類:

class Order < ActiveRecord::Base 
    #active record concerns 
    include OrderProcessingInfo 

    belongs_to :client 
    belongs_to :location 
    has_many :order_products 
    before_destroy :clear_order_products 

    after_save :after_order_saved 
    before_save :on_before_save 

    accepts_nested_attributes_for :order_products, allow_destroy: true 

    after_initialize :init #used to set default values 

    validate :client_order_validations 

    def client_order_validations 
    if self.type == OrderTypes::client[:id] && self.client_id.nil? 
     errors.add(:client_id, _("choose a client")) 
    end 

    end 
... 

end 

感謝, 埃裏克

+2

看起來還有另一個「Order」或「InventoryOrder」類,或者它在幾個地方定義(monkeypatching?)。另請檢查您是否將eager_load設置爲true。 – Roman

+0

@羅曼:是的,這應該是它 –

回答

1

做得更多一些挖掘和的幫助下之後羅馬人評論我能夠弄清楚,這個問題是我使用舊版慣例的ActiveRecord :: Concerns在Windows上運行良好但不是uni基於x的系統。

根據this RailsCasts您可以定義您的問題是這樣的:

在../models/concerns/order/order_processing_info.rb

class Order 
module OrderProcessingInfo 
    extend ActiveSupport::Concern 

    included do 

    end 
    ... 
end 

但根據this正確的方式來定義關注將

1)放入../models/concerns/[FILENAMEHERE的]代替../models/concerns/[CLASSNAMEHERE]/[FILENAMEHERE]

2)定義模塊,而不在類包裝這樣的:

module OrderProcessingInfo 
    extend ActiveSupport::Concern 

    included do 

    end 
end 

採取了一些挖掘才能到它的底部,但希望這能幫助別人那裏。

相關問題