2016-05-01 15 views
5

Tôi đang sử dụng ruby '2.3.0''rails', '3.2.22.2'."Loại lỗi: không chuyển đổi ẩn nil thành chuỗi" khi mong muốn tải kết quả

Tôi cần một chút trợ giúp & giải thích về truy vấn tôi đã thực hiện. Dưới đây là mô hình của tôi:

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 

Tôi muốn lấy tất cả các assessment_raws, và tải háo hức phiên liên quan và mailing_schedulers.

chỉ

1. háo hức tải phiên

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] 

Tất nhiên để có được số lượng các mailing_schedulers, đường ray phải truy vấn (N + 1 vấn đề)

2. phiên tải háo hức và 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> 

ouch. Tôi nghĩ rằng tôi cần một LEFT OUTER JOIN ở đây vì tất cả assessment_raws không có mailing_schedulers, đúng không?

Bất kỳ trợ giúp nào được đánh giá cao.

+0

'includes' tôi xử lý khi không có hàng liên quan. Điều gì sẽ xảy ra khi bạn sử dụng Ruby 2.2.5 hoặc 2.3.1? Rails 3.2.22.1 chưa được chứng nhận chống lại Ruby 2.3. * (Nó đã hết sức sống) và 2.3.0 có một số lỗi, vì vậy có một vài lý do có thể khiến đây có thể là lỗi. –

+0

Ho! Bạn có thể cho tôi biết nơi tôi có thể tìm thêm thông tin về phiên bản Ruby mới nhất để sử dụng với Rails 3.2.22.1 không? Tôi có rất nhiều vấn đề với ứng dụng của tôi (mem bloat, mem leak) trên Heroku ... nó có thể liên quan đến phiên bản ruby ​​mà tôi sử dụng? –

+1

Điều này nói rằng Rails 3.2.22 hoạt động với Ruby 2.2: http://weblog.rubyonrails.org/2015/6/16/Rails-3-2-22-4-1-11-and-4-2-2 Đã được phát hành và nhiều hơn nữa/Đã có hai bản phát hành của Rails 3.2 kể từ đó, nhưng chúng là các bản sửa lỗi bảo mật không nói gì về sự hỗ trợ thêm của Ruby. –

Trả lời

3

Sự cố này xảy ra do thay đổi được thực hiện trong Ruby 2.3, tại đó Hash giờ phản hồi lại to_proc gây nhầm lẫn với phương thức interpolate. Xem báo cáo lỗi này để biết thêm chi tiết: https://github.com/rails/rails/issues/25010. Cũng lưu ý có một giải pháp được đề cập đã giải quyết vấn đề cho tôi, nhưng trừ khi bạn chắc chắn rằng bạn không sử dụng to_proc mới, nó có khả năng có thể nguy hiểm.

gì làm việc cho tôi: tôi đã thêm các bản vá khỉ gợi ý (như hình dưới đây) để đầu config/application.rb

class Hash 
    undef_method :to_proc if self.method_defined?(:to_proc) 
end 
Các vấn đề liên quan