2016-05-01 14 views
5

私はruby '2.3.0''rails', '3.2.22.2'を使用しています。"TypeError:文字列へのnilの暗黙的変換なし"

私が作成したクエリについて少しの助けが必要です。&ここに私のモデルです:

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 

私はすべてのassessment_raws、そして熱心な負荷に関連するセッションとmailing_schedulersを取得したいです。

1熱心な負荷のみセッション

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] 

もちろん、mailing_schedulersの数を取得するには、レールでクエリする必要があります(N + 1問題)

回の2.熱心なロード・セッションと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> 

痛いです。私はすべてのassessment_rawsにmailing_schedulersがないので、ここではLEFT OUTER JOINが必要だと思いますよね?

助けてください。

+0

のトップ 'に提案モンキーパッチを追加しました。 Ruby 2.2.5または2.3.1を使用するとどうなりますか? Rails 3.2.22.1はRuby 2.3。*(それは寿命が終わっている)と2.3.0にいくつかのバグを持っていないので、これがバグかもしれない理由が考えられます。 –

+0

Ho! Rails 3.2.22.1で使用する最新のRubyバージョンの詳細をどこから見つけることができますか?私はHeroku上で私のアプリ(mem bloat、mem leak)に非常に多くの問題を抱えています...それは私が使っているRubyのバージョンにリンクすることができますか? –

+1

これは、Rails 3.2.22がRuby 2.2で動作することを示しています。http://weblog.rubyonrails.org/2015/6/16/Rails-3-2-24-4-1-11-and-4-2-2 -have-been-released-and-more /それ以降、Rails 3.2のリリースは2回ありましたが、追加のRubyサポートについては何も言わなかったセキュリティ修正です。 –

答えて

3

この問題は、Hashto_procに応答するRuby 2.3で変更されたために発生しました。これはinterpolateメソッドを混乱させます。詳細については、このバグレポートを参照してください:https://github.com/rails/rails/issues/25010。また、私の問題を解決した回避策がありますが、新しいto_procを使用しないことが確実でない限り、潜在的に危険です。

何が私のために働い:(下図のように)私は、関連する行がないときに処理includes`私config/application.rb

class Hash 
    undef_method :to_proc if self.method_defined?(:to_proc) 
end 
関連する問題