2017-09-26 1 views
0

Ich habe eine Sammlung von characters in following. Jeder character hat einen einzigartigen Griff. Ich habe die Datenbank überprüft, um sicherzustellen, dass es nur eine character mit dem Handle barry1 gibt. Ich versuche zu tun:Schienen nicht verstehen .include? Verhalten

following.include?(other_character) # false 

Es ist falsch Rückkehr, aber ich bin sicher, dass barry1 in following ist. Es denkt, dass die id s sind anders, aber es gibt nur eine barry1. Was ist los?

character.rb

has_many :following, through: :active_follow_relationships, source: :followed 

Puts:

puts following.first.handle # barry1 
puts other_character.handle # barry1 

puts following.first  # #<Character:0x007fef15231490> 
puts other_character  # #<Character:0x007fef09bb4d58> 

puts following.first.id # 21 
puts other_character.id # 8 
+0

Sie es in Ihrer Lösung haben folgende [21] nicht other_character [8] – MZaragoza

+0

Include funktioniert nicht, wenn Objekte nicht identisch sind. Wenn Sie die Aufnahme durch die Handle-Eigenschaft überprüfen möchten, tun Sie Folgendes: following.any? {| f | f.handle == other_character.handle} –

Antwort

0

es scheint, dass tatsächlich mindestens zwei verschiedene characters das handle Attribut mit dem Wert barry1 haben. (vgl. Ziffern 21 und 8). Sie sind beide an einem anderen Ort im Gedächtnis beharrt und haben somit zwei unterschiedliche IDs.

Wenn Sie jedoch überprüfen möchten, dass die Sammlung following enthält mindestens eine characters mit dem handle gleich Attribut barry1 sollte diese Arbeit:

following.pluck(:handle).include? other_character.handle

+0

Das wird gut funktionieren, aber wenn er später 'following' verwenden will, erstellt rails nach der Prüfung zwei Abfragen (zuerst für das Zupfen nur der Spalte': handle', zweitens für 'folgende' Objekte) –

+0

In der Konsole' Character.find_by (handle: 'barry1') 'gibt nur einen einzelnen Datensatz zurück. Wie ist es möglich, dass es einen einzigen Datensatz in der Datenbank gibt, aber zwei Datensätze im Speicher? – Bazley

+1

Das Speicherobjekt ist nur eine Repräsentation des Datenbankobjekts, Sie können mehrere Variablen (Instanzen) derselben DB-Zeile erstellen und sie werden nicht im selben Speicherbereich platziert. Überprüfen Sie dies: https://stackoverflow.com/questions/4738439/how-to-test-for-actrecord-object-equality –

Verwandte Themen