2017-09-13 42 views
1

我在创建应用程序上的新对象时遇到问题。显然,数据会在我的Sequel :: Model和db表本身之间的某处丢失,从而导致具有id和NULL的所有属性。Ruby续集SQLite3应用程序将有效对象保存到具有NULL属性的数据库中

这是我的模型:

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 

这是创建它的表迁移:

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

我使用roda框架。这里是wallet_app.rb,其中创建钱包对象:

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 

正如上述类的评论中指出的,对象是在数据库插入之前有效,这些属性将显示设置正确。尽管如此,数据仍然保留为所有属性为NULL。我假设在迁移或模型定义中出现错误,但找不到任何错误。

万一有帮助,我在这里也复制我的Gemfile:

source "https://rubygems.org" 

ruby '2.1.2' 

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

在此先感谢

回答

0

你应该删除attr_accessor :address, :balance,那就是破坏事情。 Sequel :: Model将属性存储在values哈希中,而不是作为单独的实例变量。

+0

这是做到了。谢谢@Jeremy – ntonnelier

0

我用的ActiveRecord和Rails,但根据Sequel documentation你可以使用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 

您最终可以在迁移中的地址列上设置唯一的约束,而不是在mod中的唯一性验证埃尔。 这种方法应该可以防止一些自定义验证的副作用(尽管你看起来并不假)

相关问题