2016-05-01 13 views
5

Ich verwende ruby '2.3.0' und 'rails', '3.2.22.2'."TypeError: keine implizite Umwandlung von Nil in String", wenn eifrig lädt Ergebnisse

Ich brauche ein wenig Hilfe & Erklärungen über eine Abfrage, die ich gemacht habe. Hier ist meine Modelle:

class AssessmentRaw < ActiveRecord::Base 
    belongs_to :session 
    has_many :schedulers, :class_name => 'MailingScheduler', :as => :owner, :dependent => :destroy 
end 

class MailingScheduler < ActiveRecord::Base 
    belongs_to :owner, :polymorphic => true 
end 

class Session < ActiveRecord::Base 
    has_many :assessment_raws, :dependent => :destroy 
end 

ich alle assessment_raws abrufen möchten, und eifrig Last die zugehörigen Sitzungen und mailing_schedulers.

1. eifrig Last nur Sitzungen

ars = AssessmentRaw.includes(:session).where("sessions.start_at >= ?", 1.year.ago).limit(10)

ars.map { |ar| ar.session.id } => [2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2902, 2903]

`ars.map { |ar| ar.schedulers.try(:size) }` 
    MailingScheduler Load (0.6ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 622 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
    MailingScheduler Load (0.6ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 725 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
    MailingScheduler Load (0.3ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 771 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
    MailingScheduler Load (0.3ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 782 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
    MailingScheduler Load (0.3ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 881 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
    MailingScheduler Load (0.2ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 996 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
    MailingScheduler Load (0.3ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 1087 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
    MailingScheduler Load (0.3ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 1155 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
    MailingScheduler Load (0.2ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 653 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
    MailingScheduler Load (0.2ms) SELECT "mailing_schedulers".* FROM "mailing_schedulers" WHERE "mailing_schedulers"."owner_id" = 940 AND "mailing_schedulers"."owner_type" = 'AssessmentRaw' 
=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

Um die Anzahl der mailing_schedulers zu ermitteln, müssen die Rails abgefragt werden (N + 1 Problem)

2. eifrig Last Sitzungen und mailing_schedulers

ars = AssessmentRaw.includes(:schedulers,:session).where("sessions.start_at >= ?", 1.year.ago).limit(10)

TypeError: no implicit conversion of nil into String 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/arel-3.0.3/lib/arel.rb:40:in `initialize' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/arel-3.0.3/lib/arel.rb:40:in `new' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/arel-3.0.3/lib/arel.rb:40:in `sql' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/associations/join_helper.rb:47:in `block in sanitize' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/associations/join_helper.rb:45:in `map' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/associations/join_helper.rb:45:in `sanitize' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/associations/join_dependency/join_association.rb:104:in `block in join_to' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/associations/join_dependency/join_association.rb:74:in `each' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/associations/join_dependency/join_association.rb:74:in `each_with_index' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/associations/join_dependency/join_association.rb:74:in `join_to' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation/query_methods.rb:370:in `block in build_joins' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation/query_methods.rb:369:in `each' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation/query_methods.rb:369:in `build_joins' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation/query_methods.rb:266:in `build_arel' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation/query_methods.rb:260:in `arel' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation/finder_methods.rb:259:in `construct_limited_ids_condition' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation/finder_methods.rb:243:in `apply_join_dependency' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation/finder_methods.rb:232:in `construct_relation_for_association_find' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation/finder_methods.rb:211:in `find_with_associations' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation.rb:171:in `exec_queries' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation.rb:160:in `block in to_a' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/explain.rb:41:in `logging_query_plan' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation.rb:159:in `to_a' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/activerecord-3.2.22.2/lib/active_record/relation.rb:498:in `inspect' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/railties-3.2.22.2/lib/rails/commands/console.rb:47:in `start' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/railties-3.2.22.2/lib/rails/commands/console.rb:8:in `start' 
    from /Users/oim/.rbenv/versions/2.3.0/gemsets/project-gems/gems/railties-3.2.22.2/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>'irb(main):064:0> 

autsch. Ich denke, ich brauche einen LINKEN ÄUSSEREN JOIN hier, weil alle assessment_raws keine mailing_scheduler haben, richtig?

Jede Hilfe wird geschätzt.

+0

'includes' behandelt, wenn es keine zugehörigen Zeilen sind. Was passiert, wenn Sie Ruby 2.2.5 oder 2.3.1 verwenden? Rails 3.2.22.1 wurde nicht gegen Ruby 2.3. * Zertifiziert (es ist am Ende der Lebensdauer) und 2.3.0 hatte einige Bugs, daher gibt es einige mögliche Gründe, warum dies ein Bug sein könnte. –

+0

Ho! Können Sie mir sagen, wo ich weitere Informationen über die neueste Ruby-Version finden kann, die mit Rails 3.2.22.1 verwendet werden kann? Ich habe so viele Probleme mit meiner App (Mem Bloat, Mem Leak) auf Heroku ... könnte es mit der Ruby-Version verknüpft werden, die ich verwende? –

+1

Dies besagt, dass Rails 3.2.22 mit Ruby 2.2 funktioniert: http://weblog.rubyonrails.org/2015/6/16/Rails-3-2-22-4-1-11-and-4-2-2 -have-be-released-and-more/Es gab seither zwei Versionen von Rails 3.2, aber es handelte sich um Sicherheitsupdates, die nichts über zusätzliche Ruby-Unterstützung aussagten. –

Antwort

3

Dieses Problem tritt aufgrund einer Änderung in Ruby 2.3 wo Hash reagiert jetzt auf to_proc, die die interpolate Methode verwirrt. In diesem Fehlerbericht finden Sie weitere Details: https://github.com/rails/rails/issues/25010. Beachten Sie auch, dass eine Problemumgehung erwähnt wird, die das Problem für mich gelöst hat, aber wenn Sie nicht sicher sind, dass Sie das neue to_proc nicht verwenden, könnte es möglicherweise gefährlich sein.

Was für mich gearbeitet: Ich habe das vorgeschlagen Affe Patch hinzugefügt nach oben (siehe unten) meiner config/application.rb

class Hash 
    undef_method :to_proc if self.method_defined?(:to_proc) 
end