【问题标题】:active record with ruby (not rails)使用 ruby​​ 进行活动记录(不是 rails)
【发布时间】:2015-08-28 12:25:39
【问题描述】:

我正在使用带有 ruby​​ 的活动记录(但不是 rails)。我正在使用 sqlite3,它在文件中有一个 test.db(不仅仅是在内存中)。当我使用 user.create 运行以下代码 sn-p 时,它会抱怨参数错误(当我使用 use.save 时,它​​会引发活动记录异常。知道我可能做错了什么吗?谢谢

    require 'rubygems'
    gem 'activerecord'

    require 'sqlite3'
    require 'active_record'

    ActiveRecord::Base.logger = Logger.new(STDERR)
    #ActiveRecord::Base.colorize_logging = false

    ActiveRecord::Base.establish_connection(
      :adapter => 'sqlite3',
      :host => "localhost",
      :database => 'test.db'
    )

    class User < ActiveRecord::Base
        #attr_accessible :email, :full_name
      attr_accessor :email
      attr_accessor :full_name

    validates :email, presence: true, uniqueness: true

      def initialize(email, full_name)
        @email = email
        @full_name = full_name
      end
    end

    puts "full_name for user:"
    full_name = gets.chomp
    puts "email address:"
    email = gets.chomp
    user = User.new(email, full_name)
    #user.save
    user = User.create!(email: '', full_name: '')

第一种情况下的异常(使用 User.create!):

main.rb:42:in `initialize': wrong number of arguments (1 for 2) (ArgumentError)
        from /var/lib/gems/1.9.1/gems/activerecord-4.2.4/lib/active_record/inheritance.rb:61:in `new'
        from /var/lib/gems/1.9.1/gems/activerecord-4.2.4/lib/active_record/inheritance.rb:61:in `new'
        from /var/lib/gems/1.9.1/gems/activerecord-4.2.4/lib/active_record/persistence.rb:50:in `create!'
        from main.rb:55:in `<main>'

【问题讨论】:

  • 能否给出异常的stacktrace?
  • @JeanBob 添加 - 谢谢

标签: ruby sqlite activerecord


【解决方案1】:

它在抱怨new 方法。根据文档:(http://api.rubyonrails.org/classes/ActiveRecord/Base.html),您不需要initialize,因为当您从ActiveRecord::Base 继承时,您需要使用哈希初始化您的对象。

user = User.new({email: email, full_name: full_name})
# or
user = User.new(email: email, full_name: full_name)
# then
user.save

您需要从代码中删除 initializeattr_accessor

【讨论】:

    【解决方案2】:

    尝试注释 User#initialize 方法并像这样创建新用户:

    User.create! email: 'halk@mail.com', full_name: 'Halk'
    

    说明

    当您通过 ActiveRecord::Base 类的继承声明 AR 模型时,您不需要定义自己的 #initialize 方法。但你做了。当您调用 User::create! 方法时,您只传递 一个 参数 - Hash 和两对(带有电子邮件和全名键)。但是User#initialize 分别定义了 两个 参数 - email 和 full_name。所以 Ruby 异常提出并谈论它:

    wrong number of arguments (1 for 2) (ArgumentError)
    

    【讨论】:

    • 由于某种原因,该语法给了我一个错误 - 也许我做错了什么。但你的主要观点是正确的
    • 哦,对不起,我通过name 键而不是full_name。已编辑。
    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多