2015-05-31 16 views
6

In un'applicazione Rails che utilizza SQLite3 Vorrei utilizzare i valori float Float::INFINITY e -Float::INFINITY in un modello con un attributo a virgola mobile. L'esecuzione delle query INSERT utilizzando Model.create! sembra funzionare correttamente, dal momento che activerecord utilizza istruzioni preparate in questo caso. Tuttavia, quando si tenta di aggiornare un record utilizzando foo.save, ActiveRecord non usa uno stament preparato e appena mette la stringa Infinity destra nella query, con conseguenteUtilizzo di flottanti infiniti in Ruby on Rails

SQLite3::SQLException: no such column: Infinity 

C'è un modo per aggirare questo o fare Devo ricorrere all'utilizzo di stringhe nel modello/database?

Rails versione 3.2.21, versione SQLite3 1.3.10


Modifica. Per ora ho cambiato il tipo di colonna per string nella migrazione di database e utilizzare

serialize :property, Float 

dire ActiveRecord per memorizzare carri YAML-serializzati nel database, che consente di memorizzare Float::INFINITY bene.

risposta

0

È perché Float::INFINITY in rotaie è definito come 1.0/0, che sqlite3 non sa cosa fare con esso. È possibile utilizzare un numero molto grande per definire l'infinito come 9e999 in sostituzione del valore che si intende salvare nel database

+1

No, [IEEE754] (http://en.wikipedia.org/wiki/IEEE_floating_point) esplicitamente definisce i valori float chiamati + ∞ e -∞. L'hai ottenuto all'indietro, '1.0/0' è definito come' Float :: INFINITY'. Impostando un attributo a '9e999' si ottiene che la variabile sia impostata su' Float :: INFINITY', quindi ottengo lo stesso errore SQLite3. – Christoph

+1

Mi dispiace per quello. Non sono così familiare con float :) L'idea è solo quella di provare un numero molto grande come sostituto dell'infinito. Ad ogni modo, hai provato a utilizzare 'Float :: MAX'? L'ho appena scoperto e sapevo che i numeri più grandi di questo equivalgono all'infinito nel rubino. –