2016-04-19 1 views
0

Ich habe eine Menge (+100,000) Datensätze, die ich verarbeiten möchte durch eine Abfrage.Rails 3 - .each funktioniert, .find_each schlägt fehl -> ActiveRecord :: JDBCError: FEHLER: Operator existiert nicht: Zeichenvariable> = ganze Zahl

Ich wurde mit so etwas wie:

BigRecordPull.where(name: ['x','y','z']).each { |record| do_some_action record } 

Da diese aus einem Speicher Management-Perspektive ist nicht gut, ich wollte stattdessen verwenden find_each als here skizzierte so jetzt sieht der Code wie folgt aus:

BigRecordPull.where(name: ['x','y','z']).find_each { |record| do_some_action record } 

Das Problem ist, wenn ich den Code ich die folgende Fehlermeldung erhalten Feuer:

ActiveRecord::JDBCError: ERROR: operator does not exist: character varying >= integer Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

Wenn ich die SQL-Abfrage erstellt in den Protokollen überprüfen bekomme ich wieder so etwas wie:

SELECT "big_record_pull".* FROM "big_record_pull" WHERE "big_record_pull"."name" IN ('x','y','z') AND ("big_record_pull"."name" >= 0) 

Active scheint den Teil hinzufügen, 'AND ("big_record_pull" "name"> = 0.)' Und das scheint um zu sein, was das Problem verursacht. Der Name in diesem Beispiel ist ein Varchar. Die zusätzliche Falte ist, dass ich nicht die Postgresql Db mein Rails Projekt Plug-Ins steuern, so dass ich nicht einfach eine Migration erneut ausführen kann, um zu versuchen, dieses Problem zu beheben. Ich hoffe, dass es eine Art von Arbeit gibt ... Ich möchte es vermeiden, SQL zu benutzen.

Zusätzliche Informationen In dem obigen Beispiel big_record_pull.name ist auch ein foreign_key

+0

für die Tabelle den Primärschlüssel ist der Name? –

+0

Name wäre ein Fremdschlüssel für eine andere Tabelle ... Es mag ein wenig verwirrend erscheinen. Nehmen wir an, big_record_pull wäre eine Tabelle mit 3 Attributen, id wäre der Primärschlüssel, Name wäre ein Fremdschlüssel (varchar) und Beschreibung wäre ein varchar (für Kichern). ob du nach name oder beschreibung suchst, die sql-frage ist ähnlich, weil sie das extra big_record_pull.name> = 0 teil erstellt, das ich nicht will/brauche – Stephen

+0

Weird. Ich würde nur das oben genannte erwarten/verstehen, wenn der Primärschlüssel (im Schienenmodell) eingestellt wurde, um anstelle des Standards der ID –

Antwort

0

Ok, wurde das Problem mit einem Edelstein verbunden: composite_primary_keys-5.0.14.gem.

Lösung wurde gefunden here

See lib/composite_primary_keys/relation/batches.rb:28:in `find_in_batches' Change this block to:

self.primary_key.each do |key| 
     condition = case relation.columns_hash[key.to_s].type 
     when :string 
      table[key].not_eq '' 
     when :integer 
      table[key].gteq start 
     end 
     relation = relation.where(condition) 
    end