Skip to content
This repository was archived by the owner on Apr 17, 2018. It is now read-only.
This repository was archived by the owner on Apr 17, 2018. It is now read-only.

Unable to fetch belongs_to association in loop #307

Description

@FergusonSean

When running the Package.all_for_account_by_delivery_date method here I get a strange error. It seems that when I am in the Package#as_json method the package cannot access it's customer or address. Any idea why this is?

Here is the error:

TypeError - compared with non class/module:
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/collection.rb:1467:in `>'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/collection.rb:1467:in `block in delegate_to_model'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/model/scope.rb:53:in `block in with_scope'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/model/scope.rb:73:in `with_exclusive_scope'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/model/scope.rb:53:in `with_scope'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/collection.rb:1466:in `delegate_to_model'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/collection.rb:1445:in `method_missing'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/associations/many_to_one.rb:186:in `lazy_load'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/resource/persistence_state/persisted.rb:23:in `lazy_load'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/resource/persistence_state/persisted.rb:8:in `get'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/model/relationship.rb:340:in `customer'
	/app/lib/package.rb:26:in `as_json'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/collection.rb:508:in `block in each'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/support/lazy_array.rb:411:in `block in each'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/support/lazy_array.rb:411:in `each'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/support/lazy_array.rb:411:in `each'
	/usr/local/bundle/gems/dm-core-1.2.1/lib/dm-core/collection.rb:505:in `each'
	/app/lib/package.rb:20:in `map'
	/app/lib/package.rb:20:in `all_for_account_by_delivery_date'
	server.rb:52:in `block in <class:Server>'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1632:in `call'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1632:in `block in compile!'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:991:in `block (3 levels) in route!'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1010:in `route_eval'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:991:in `block (2 levels) in route!'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1037:in `block in process_route'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1035:in `catch'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1035:in `process_route'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:989:in `block in route!'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:988:in `each'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:988:in `route!'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1094:in `block in dispatch!'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1073:in `block in invoke'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1073:in `catch'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1073:in `invoke'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1091:in `dispatch!'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:923:in `block in call!'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1073:in `block in invoke'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1073:in `catch'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1073:in `invoke'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:923:in `call!'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:913:in `call'
	/usr/local/bundle/gems/rack-protection-2.0.0/lib/rack/protection/xss_header.rb:18:in `call'
	/usr/local/bundle/gems/rack-protection-2.0.0/lib/rack/protection/path_traversal.rb:16:in `call'
	/usr/local/bundle/gems/rack-protection-2.0.0/lib/rack/protection/json_csrf.rb:26:in `call'
	/usr/local/bundle/gems/rack-protection-2.0.0/lib/rack/protection/base.rb:50:in `call'
	/usr/local/bundle/gems/rack-protection-2.0.0/lib/rack/protection/base.rb:50:in `call'
	/usr/local/bundle/gems/rack-protection-2.0.0/lib/rack/protection/frame_options.rb:31:in `call'
	/usr/local/bundle/gems/rack-2.0.3/lib/rack/logger.rb:15:in `call'
	/usr/local/bundle/gems/rack-2.0.3/lib/rack/common_logger.rb:33:in `call'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:231:in `call'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:224:in `call'
	/usr/local/bundle/gems/rack-2.0.3/lib/rack/head.rb:12:in `call'
	/usr/local/bundle/gems/rack-2.0.3/lib/rack/method_override.rb:22:in `call'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/show_exceptions.rb:22:in `call'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:194:in `call'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1955:in `call'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1499:in `block in call'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1726:in `synchronize'
	/usr/local/bundle/gems/sinatra-2.0.0/lib/sinatra/base.rb:1499:in `call'
	/usr/local/bundle/gems/thin-1.7.1/lib/thin/connection.rb:86:in `block in pre_process'
	/usr/local/bundle/gems/thin-1.7.1/lib/thin/connection.rb:84:in `catch'
	/usr/local/bundle/gems/thin-1.7.1/lib/thin/connection.rb:84:in `pre_process'
	/usr/local/bundle/gems/thin-1.7.1/lib/thin/connection.rb:50:in `block in process'
	/usr/local/bundle/gems/eventmachine-1.2.3/lib/eventmachine.rb:1076:in `block in spawn_threadpool'

And here is the relevant code:

class Account
  include DataMapper::Resource

  has n, :packages
  has n, :recipes
  has n, :sizes

  property :id, Integer, key: true
  property :name, String
end

class Address
  include DataMapper::Resource

  belongs_to :account
  has n, :packages

  property :id, Serial
  property :first_name, String
  property :address1, String
  property :phone, String
  property :city, String
  property :zip, String
  property :province, String
  property :country, String
  property :last_name, String
  property :address2, String
  property :company, String
  property :latitude, Decimal, scale: 12, precision: 15
  property :longitude, Decimal, scale: 12, precision: 15
  property :name, String
  property :country_code, String
  property :province_code, String

end

class Customer
  include DataMapper::Resource

  belongs_to :account
  belongs_to :address
  has n, :packages

  property :id, Serial
  property :external_id, String, allow_nil: false
  property :first_name, String, allow_nil: false
  property :last_name, String, allow_nil: false
  property :email, String, allow_nil: false

  def name
    "#{first_name} #{last_name}"
  end
end

class MealAssignment
  include DataMapper::Resource

  belongs_to :recipe
  belongs_to :package

  property :id, Serial
  property :quantity, Integer
end

class Recipe
  include DataMapper::Resource

  belongs_to :account
  property :id, Serial
  property :name, String
  property :description, Text

end

class Size
  include DataMapper::Resource

  belongs_to :account
  property :id, Serial
  property :name, String
  property :amount, Decimal, scale: 2, precision: 6 

end

class Package
  include DataMapper::Resource

  has n, :meal_assignments
  belongs_to :customer
  belongs_to :address
  belongs_to :account
  belongs_to :size, required: false

  property :id, Serial
  property :deliver_on, Date
  property :pack, String, length: 255
  property :required_meals, Integer
  property :special_instructions, Text
  property :external_order_id, String

  def self.all_for_account_by_delivery_date(account)
    account.packages.map(&:as_json).group_by{|e| e[:deliver_on]}
  end

  def as_json(options = {})
    {
      deliver_on: deliver_on,
      customer_name: customer.name,
      address: address.to_s,
      size: size.as_json,
      pack: pack,
      required_meals: required_meals,
      special_instructions: special_instructions,
      external_order_id: external_order_id,
      meals: meal_assignments.map{|ma| ma.recipe.as_json}
    }
  end

  def self.get_delivery_dates_for_account(account)
    repository(:default).adapter.select(<<-SQL, account.id
      SELECT distinct deliver_on 
      FROM packages 
      WHERE account_id = ?
      ORDER BY deliver_on DESC
      SQL
    )
  end
end

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions