1

私の単純な Sqlite3 データベースは次のとおりです。

CREATE TABLE balances(
balance zilch
);

私のRubyは次のとおりです。

require('active_record')
ActiveRecord::Base.establish_connection(:database => "testbalance.db", :adapter => "sqlite3")
class Balance < ActiveRecord::Base
end
x = Balance.new
x.balance = 50
x.save

出て戻ってきてまた同じRubyで入ると、最初(実行前x.balance = 50)の残高はnilです。どうしてこれなの?DB が保存されないのはなぜですか?

4

2 に答える 2

2

同じコードを入力すると、新しいオブジェクトが再度作成されます。そのバランスが であることも不思議ではありませんnil

オブジェクトが保存されていることを確認するには、(たとえば)Balance.countレコード作成の前後を確認できます。

于 2012-06-01T20:30:17.660 に答える
0

これは Active Record を使用する古いデモ方法であり、本番環境ではあまり役に立ちません。しかし、それはあなたを始めさせます。私のコードは、sqlite3 gem を必要とせずに接続を確立します。:adapter ハッシュ エントリを使用すると、Active Record に含まれると思います。もちろん、インストールする必要がありますが、Active Record のコードでは実際には必要ありません。見る必要なしに試してみてください。それでも疑問がある場合は、楽しみのために gem をアンインストールしてください。特にデータベースが既に存在するかどうかをチェックする Active Record の名前空間とメソッドは他にもあります。次に、作成をバイパスします。これは本 Metaprogramming Ruby のサンプル コードです。

#---
# Excerpted from "Metaprogramming Ruby",
# published by The Pragmatic Bookshelf.
# Copyrights apply to this code. It may not be used to create training   material, 
# courses, books, articles, and the like. Contact us if you are in doubt.
# We make no guarantees that this code is fit for any purpose. 
# Visit http://www.pragmaticprogrammer.com/titles/ppmetr2 for more book information.
#---

# Create a new database each time
File.delete 'dbfile' if File.exist? 'dbfile'

require 'active_record'
ActiveRecord::Base.establish_connection :adapter => "sqlite3",
                                    :database => "dbfile.sqlite3" 

# Initialize the database schema
ActiveRecord::Base.connection.create_table :ducks do |t|
  t.string  :name
end

class Duck < ActiveRecord::Base
  validate do
    errors.add(:base, "Illegal duck name.") unless name[0] == 'D'
  end
end

my_duck = Duck.new
my_duck.name = "Donald"
my_duck.valid?         # => true
my_duck.save!

require_relative '../test/assertions'
assert my_duck.valid?

bad_duck = Duck.new(:name => "Ronald")
assert !bad_duck.valid?

duck_from_database = Duck.first
duck_from_database.name         # => "Donald"

assert_equals "Donald", duck_from_database.name

duck_from_database.delete

File.delete 'dbfile' if File.exist? 'dbfile'

このコードは、使用後に db ファイルを削除しますが、これもあまり良い持続性ではありません。ただし、アサーションをテストするためだけのものであるため、アイデアを得ることができます。残高を変更するときに確認することができます。

残りのコードが必要ですか? https://pragprog.com/book/ppmetr/metaprogramming-ruby

私はあなたを訓練していますか、それとも私は似ていますか?ここで私が間違っている場合、モデレーターはこれを削除してください。私は悪い例を設定したくありません。

于 2015-02-06T04:04:49.550 に答える