2015-05-31 13 views
6

W aplikacji Rails przy użyciu SQLite3 Chciałbym użyć wartości float Float::INFINITY i -Float::INFINITY w modelu z atrybutem zmiennoprzecinkowym. Uruchamianie zapytań INSERT przy użyciu wydaje się działać dobrze, ponieważ activerecord używa w tym przypadku przygotowanych instrukcji. Jednak przy próbie aktualizacji rekordu przy użyciu foo.save, activerecord nie używa przygotowaną stament i po prostu umieszcza ciąg Infinity prawo w zapytaniu, w wynikuUżywanie nieskończonych obiektów pływających w Ruby on Rails

SQLite3::SQLException: no such column: Infinity 

Czy istnieje sposób, aby obejść ten problem, czy Muszę uciekać się do używania ciągów w modelu/bazie danych?

Szyny wersja 3.2.21, SQLite3 wersja 1.3.10


Edit. Na razie zmieniłem typ kolumny do string w migracji bazy danych i używać

serialize :property, Float 

powiedzieć ActiveRecord do przechowywania YAML-odcinkach pływaków w bazie danych, co pozwala na przechowywanie Float::INFINITY dobrze.

Odpowiedz

0

To dlatego, że Float::INFINITY w szynach jest zdefiniowany jako 1.0/0, że sqlite3 nie wie, co z tym zrobić. Możesz użyć bardzo dużej liczby, aby zdefiniować nieskończoność, na przykład 9e999, jako zamiennik wartości, którą będziesz zapisywać w bazie danych.

+1

Nie, [IEEE754] (http://en.wikipedia.org/wiki/IEEE_floating_point) jawnie definiuje wartości zmiennoprzecinkowe o nazwach + ∞ i -∞. Masz go w tył, '1.0/0' jest zdefiniowany jako' Float :: INFINITY'. Ustawienie atrybutu na '9e999' powoduje, że zmienna jest ustawiana na' Float :: INFINITY', stąd pojawia się ten sam błąd SQLite3. – Christoph

+1

Przepraszam za to. Nie jestem zaznajomiony z floatem :) Chodzi o to, aby wypróbować bardzo dużą liczbę jako zamiennik nieskończoności. W każdym razie, czy próbowałeś użyć 'Float :: MAX'? Właśnie odkrył to i wiedział, że liczby większe niż to równa się nieskończoności w rubinie. –