2016-04-17 9 views
1

Ich habe meinen Rubin gerade ein Upgrade auf Schienen projizierenhas_many Beziehung implizite Konvertierungsfehler nach Rubin Upgrade und Schienen Version

Rubin 1.9.3-P551 zu Rubin 2.3.0

und

Schienen 3.2.13 bis Schienen 3.2.22 (3-2-stabil)

Es gab keine Fehler vor dem Upgrade.

In meinem Benutzermodell habe ich einige komplexe Beziehungen, um die Kontakte eines Benutzers zu verwalten, und beim Zugriff auf diese Beziehungen bekomme ich eine keine implizite Umwandlung von Null in String Fehler.

Die Beziehungen sind definiert als -

has_many :contacts, :foreign_key => 'owner_id' 
has_many :pending_invited, conditions: {:'contacts.confirmed' => false, :'contacts.denied' => false }, through: :contacts, class_name: 'User', source: :user 
has_many :invited, conditions: { :'contacts.confirmed' => true }, through: :contacts, class_name: 'User', source: :user 

has_many :inverse_contacts, :foreign_key => 'user_id', :class_name => 'Contact' 
has_many :pending_invited_by, conditions: {:'contacts.confirmed' => false, :'contacts.denied' => false }, through: :inverse_contacts, class_name: 'User', source: :owner 
has_many :invited_by, conditions: {:'contacts.confirmed' => true }, through: :inverse_contacts, class_name: 'User', source: :owner 

has_many :denied, conditions: {:'contacts.denied' => true }, through: :contacts, class_name: 'User', source: :user 
has_many :denied_by, conditions: {:'contacts.denied' => true }, through: :inverse_contacts, class_name: 'User', source: :owner 

Mit Schienen c ich in der Lage bin zu einem Stack-Trace zu erhalten, indem Sie -

u = User.first 
u.pending_invited_by 

und dies erzeugt den folgenden Fehler -

TypeError: no implicit conversion of nil into String 
    from .bundle/gems/arel-3.0.3/lib/arel.rb:40:in `initialize' 
    from .bundle/gems/arel-3.0.3/lib/arel.rb:40:in `new' 
    from .bundle/gems/arel-3.0.3/lib/arel.rb:40:in `sql' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/join_helper.rb:47:in `block in sanitize' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/join_helper.rb:45:in `map' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/join_helper.rb:45:in `sanitize' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/association_scope.rb:94:in `block in add_constraints' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/association_scope.rb:39:in `each' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/association_scope.rb:39:in `each_with_index' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/association_scope.rb:39:in `add_constraints' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/association_scope.rb:31:in `scope' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/association.rb:99:in `association_scope' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/association.rb:88:in `scoped' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/has_many_through_association.rb:178:in `find_target' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/collection_association.rb:335:in `load_target' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/collection_proxy.rb:44:in `load_target' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/activerecord/lib/active_record/associations/collection_proxy.rb:89:in `method_missing' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/railties/lib/rails/commands/console.rb:47:in `start' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/railties/lib/rails/commands/console.rb:8:in `start' 
    from .bundle/bundler/gems/rails-f85bbed4cdc1/railties/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 

Jede Hilfe wird geschätzt.

+0

run gem --system auf cmd Linie aktualisieren wird es wahrscheinlich Fix – Boltz0r

Antwort

2

Eigentlich Ich bin heute auf dieses Problem gestoßen. Das Problem ist die Kombination von modernem Ruby (2.3) mit uraltem ActiveRecord (3.2.22). Ruby 2.2 hat dieses Problem NICHT.

In Ruby 2.3 reagiert Hash auf to_proc, die einen unerwarteten Fehler in ActiveRecord 3.2 auslöst.

Überprüfen Sie https://github.com/rails/rails/issues/25010 für weitere Details/Diskussion.

Meine vorübergehende Lösung war Hash.to_proc undefine, wie ich 100% sicher keinen meines Code oder Edelsteine ​​bin verwendet, das noch:

class Hash undef_method :to_proc end

1

Das Problem war mit den Bedingungen hat. Der ursprüngliche Hash funktioniert nicht unter 3.2.22.

conditions: {:'contacts.confirmed' => false, :'contacts.denied' => false } 

Es funktioniert auch nicht besser ausgebildet Hash im Format verwenden -

conditions: { contacts: { confirmed: false, denied: false } } 

Die Lösung ist stattdessen eine Abfrage-String zu verwenden -

conditions: [ '"contacts"."confirmed" = :t1 and "contacts"."denied" = :t2', {t1: false, t2: false} ]