Ruby Sequel SQLite3应用程序使用NULL属性将有效对象保存到数据库

时间:2017-09-13 14:54:30

标签: ruby sqlite sequel roda

我在应用程序上创建新对象时遇到问题。显然,我的Sequel :: Model和db表本身之间的数据丢失,导致id为id的条目和所有属性为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,其中创建了Wallet对象:

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

正如上面类中的注释中所指出的,该对象在插入DB之前是有效的,并且属性显示正确设置。尽管如此,数据仍然保留为所有属性为NULL。我假设在迁移或模型定义中出错,但我找不到任何错误。

如果它有帮助,我也在这里复制我的Gemfile:

source "https://rubygems.org"

ruby '2.1.2'

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

提前致谢

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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