我在应用程序上创建新对象时遇到问题。显然,我的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'
提前致谢
答案 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
哈希中,而不是单独的实例变量。