1

I have many instances in my application where I use single table inheritance and everything works fine in my development environment. But when I release to production (using passenger) I get the following error:

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

Why would this work in my dev environment and not work in production? Both are using Rails 4.2 and Ruby 2.1.5. Could this be a problem with passenger?

Here is the InventoryOrder class:

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

And here is it's parent class:

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

Thanks, Eric

Eric
  • 3,434
  • 2
  • 30
  • 28

1 Answers1

1

After doing some more digging and with the help of Roman's comment I was able to figure out that this issue was a result of me using an older convention for ActiveRecord::Concerns that works fine on windows but not on unix based systems.

According to this RailsCasts you can define your concerns like this:

In ../models/concerns/order/order_processing_info.rb

class Order
 module OrderProcessingInfo
  extend ActiveSupport::Concern

  included do

  end
  ...
end

But according to this the right way to define the concern would be to

1) Put it in ../models/concerns/[FILENAMEHERE] instead of ../models/concerns/[CLASSNAMEHERE]/[FILENAMEHERE]

2) Define the module without wrapping it in the class like this:

module OrderProcessingInfo
  extend ActiveSupport::Concern

  included do

  end
end

Took some digging to get to the bottom of it but hopefully this might help someone else out there.

Community
  • 1
  • 1
Eric
  • 3,434
  • 2
  • 30
  • 28