2017-09-13 1 views
1

Ich habe Probleme beim Erstellen neuer Objekte in meiner Anwendung. Offensichtlich gehen die Daten irgendwo zwischen meinem Sequel :: Model und der db-Tabelle selbst verloren, was zu Einträgen mit einer ID und allen Attributen in NULL führt.Ruby Sequel SQLite3 App speichert gültige Objekte in der Datenbank mit NULL-Attributen

Das ist mein Modell:

class Wallet < Sequel::Model(:wallets) 
    attr_accessor :address, :balance 

    def validate 
    super 
    errors.add(:address, "Address can't be empty") if address.empty? 
    errors.add(:address, "Input address already exists in the db") unless Wallet.where(address: address).empty? 
    end 
end 

Und das ist die Migration, die es Tabelle erstellt:

Sequel.migration do 
    change do 
    create_table(:wallets) do 
     primary_key :id, unique: true 
     String :address 
     Integer :balance 
    end 
    end 
end 

I roda Rahmen bin mit. Hier ist wallet_app.rb, wo Wallet Objekte erstellt:

require 'roda' 
require 'sequel' 
require 'json' 

DB = Sequel.connect('sqlite://database.sqlite3') 

class WalletApp < Roda 
    require './lib/services/balance_service' 
    require './models/account' 

    route do |r| 
    ... 

    r.post "wallets" do 
     address = r.params["address"] 
     balance = BalanceService.get_balance(address) 
     wallet = Wallet.new(address: address, balance: balance) 
     # Until here we have the attributes correctly set on wallet object 
     if wallet.valid? && wallet.save 
     # Now wallet is persisted in the db with an id but address and balance NULL 
     wallet.to_json 
     else 
     wallet.errors.to_json 
     end 
    end 

    end 
end 

Wie oben in den Kommentaren in der Klasse ausgeführt hat, ist das Objekt gültig, bevor sie im DB Einfügen und die Attribute erscheinen richtig eingestellt ist. Die Daten bleiben jedoch erhalten, da alle Attribute NULL sind. Ich nehme einen Fehler in der Migration oder der Modelldefinition an, aber ich konnte keine finden.

Falls es hilft, kopiere ich mein Gemfile auch hier:

source "https://rubygems.org" 

ruby '2.1.2' 

gem 'roda' 
gem 'sequel' 
gem 'sqlite3' 
gem 'httparty' 

Vielen Dank im Voraus

Antwort

0

Sie sollten entfernen, das ist was bricht Dinge. Sequel :: Model speichert Attribute im values Hash, nicht als separate Instanzvariablen.

+0

das hat es getan. Danke @ Jeremy – ntonnelier

0

Ich bin es gewohnt, Active und Rails, aber nach Sequel documentation könnten Sie validation_helpers plugin:

# model 
class Wallet < Sequel::Model 
    # plugin :validation_helpers 
    def validate 
    super 
    validates_presence [:address, :balance], allow_nil: false 
    validates_unique :address 
    end 
end 

Sie könnten möglicherweise eine eindeutige Einschränkung für die Adressspalte in der Migration anstelle der Eindeutigkeitsprüfung im Mod festlegen el. Diese Methode sollte einige Nebenwirkungen von benutzerdefinierten Validierungen verhindern (trotz Ihres schien nicht betrügerisch)

Verwandte Themen