1

バックエンドで ActiveRecord を使用して IRC ボットをセットアップして、すべてのデータの重労働を処理しようとしています (おそらくやり過ぎですが、これは私にとって部分的に学習経験です:3)

私が実行している問題は、データベーススキーマを定義した後、作成したテーブルを参照しようとすると、後で同じスクリプトで、SQLite gem からテーブルが見つからないというエラーが表示されることです。

さらに、私の IDE (RubyMine) は、「:notes 関連付けフィールドのレール モデルが見つかりません」と文句を言います。

ボット フレームワークのクラスとして動作することを制限されていなければ、これは起こらないだろうと何かが教えてくれますが、それは現時点では単なる推測にすぎません。

ここで何が間違っていますか?

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)
4

2 に答える 2

1

これを交換する必要があります

class Note < ActiveRecord::Base
  has_many :notes
end

class Note < ActiveRecord::Base
end

ActiveRecord::Base クラスの子孫は、テーブル全体ではなく、テーブル内の単一の行を表します。したがって、ID でメモを見つけるには、 を呼び出すだけで済みますNote.find(123)。ここで、123 は db テーブルのメモ レコードの ID です。

于 2012-10-23T07:42:24.430 に答える
0

has_manyの使用と構文について説明してくれた皆さんに感謝しますが、私の問題は、ディスク上のテーブルではなく、メモリ内のテーブルを使用することになりました。7行目を変更して

:database => 'notes.db'

それ以外の

:database => ':memory:'

そして、Notesクラスからhas_many宣言を削除しました(これを行わずに試したところ、別のエラーが発生しました)、すべてが機能します:)

于 2012-10-23T19:29:35.453 に答える