0

我刚刚开始学习 ActiveRecord,我只是在尝试一些小事情来弄清楚一切是如何工作的。我刚刚在以下 sqlite3 数据库上尝试了以下代码。

红宝石:

class Balances < ActiveRecord::Base
  def initialize
    @balance = 50
    update_attribute(:balance, @balance)
  end
  def withdraw amount
    update_attribute(:balance, @balance-amount)
  end
end

SQL:

CREATE TABLE balance(
    balance 50
);

当我写:

balance = Balances.new

我得到:

NoMethodError: undefined method `delete' for nil:NilClass
    from /Users/Solomon/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.3/lib/active_record/attribute_methods/write.rb:28:in `write_attribute'
    from /Users/Solomon/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.3/lib/active_record/attribute_methods/dirty.rb:67:in `write_attribute'
    from /Users/Solomon/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.3/lib/active_record/attribute_methods/write.rb:14:in `balance='
    from /Users/Solomon/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.3/lib/active_record/persistence.rb:180:in `update_attribute'

为什么是这样?难道我做错了什么?

4

1 回答 1

4

我注意到几件事:

  • 类名应该是Balance(大写,单数)。数据库中的表名将是小写复数。例如,balances
  • 不要initialize为 ActiveRecord 模型定义方法。而是使用after_initialize回调。一个帖子。此外,Rails 文档。

另外,模型的文件名应该是balance.rb(小写,单数)

添加了更多您可能不想在每次初始化记录实例时将记录的余额更改回 50。- 这就是您的示例当前正在做的事情。如果要将数据库中新记录的期初余额设置为 50,则使用“before_create”回调。

请记住,ActiveRecord 模型类与底层数据库中的记录相关联,但与之不同。例如,您可以创建一个 ActiveRecord 模型的实例,然后不在数据库中创建匹配的记录。-- 只有在调用 save 或 create 方法时才会创建数据库记录。

于 2012-06-01T00:14:18.010 回答