在另一个类中使用ActiveRecord

时间:2012-10-23 05:17:50

标签: ruby activerecord cinch

我正在尝试在后端使用ActiveRecord设置一个IRC机器人来处理所有数据繁重的工作(可能是矫枉过正,但对我来说这部分是一次学习经历:3)

我正在运行的问题是,在我定义我的数据库模式之后,当我尝试引用我创建的表时,稍后在同一个脚本中,我从SQLite gem得到一个错误,说它无法找到桌子。

此外,我的IDE(RubyMine)抱怨它“无法找到rails模型:notes association field”

有些东西告诉我,如果我不被限制作为一个机器人框架的一部分运行,这将不会发生,但这只是一个疯狂的猜测。

我在这里做错了什么?

require 'cinch'
  require 'active_record'
  puts 'Memobox loaded'
  class Memobox
    include Cinch::Plugin
    ActiveRecord::Base.establish_connection(
        :adapter => 'sqlite3',
        :database => ':memory:'
    )
    ActiveRecord::Schema.define do
      create_table :notes do |table|
        table.column :id, :integer
        table.column :timeset, :DateTime
        table.column :sender, :string
        table.column :recipient, :string
        table.column :text, :string
      end
    end

  class Note < ActiveRecord::Base
     has_many :notes
  end

   match(/note.*/, :prefix => "?")
   def execute(m)
    Memobox::Note.create(
        :timeset => (Time.new).ctime,
        :sender  => m.user.nick,
        :text => m.message,
        :recipient => (m.message).split("_").at(1)
        )

   end
  end

错误:

 C:/Ruby193/lib/ruby/gems/1.9.1/gems/activerecord-3.2.8/lib/active_record/connection_adapters/sqlite_adapter.rb:472:in `table_structure': Could not find table 'notes' (ActiveRecord::StatementInvalid)

2 个答案:

答案 0 :(得分:1)

你应该替换这个

class Note < ActiveRecord::Base
  has_many :notes
end

class Note < ActiveRecord::Base
end

ActiveRecord :: Base类的后代表示表中的单行,而不是整个表。 所以要通过id找到一些注释,你只需要调用Note.find(123),其中123是db表中记录记录的id。

答案 1 :(得分:0)

感谢大家澄清has_many的使用和语法,但我的问题最终是使用内存表而不是磁盘上的表。一旦我改变第七行说

:database => 'notes.db'

而不是

:database => ':memory:'

并从Notes类中删除了has_many声明(我确实尝试了它而没有这样做并得到了不同的错误),一切正常:)