1

既存のRails3.2アプリがあり、Postgresqlデータベースにセッションを保存したいと思います。Stackoverflowでこのチュートリアルを見つけ、DiegoPinoの指示に従いました。

ただし、rake db:migrateステップに到達すると、次のエラーが発生しました。

PG ::エラー:エラー:外部キー制約「sessions_session_id_fkey」は実装できません詳細:キー列「session_id」と「id」は互換性のないタイプです:文字可変と整数。

実行しようとしているSQLは次のとおりです。

CREATE TABLE "sessions" ("id" serial primary key, 
    "session_id" character varying(255) NOT NULL, 
    "data" text,
    "created_at" timestamp NOT NULL, 
    "updated_at" timestamp NOT NULL, 
    FOREIGN KEY ("session_id") REFERENCES "sessions" ("id"))

そして、これが自動的に作成された移行です:

class AddSessionsTable < ActiveRecord::Migration                                    
  def change
    create_table :sessions do |t|
      t.string :session_id, :null => false
      t.text :date
      t.timestamps
    end
    add_index :sessions, :session_id
    add_index :sessions, :updated_at
  end
end

私にとって紛らわしいのは、移行で外部キー制約宣言が表示されないことです。では、生成されたSQLがテキストフィールドと整数フィールドをリンクしようとしているのはなぜですか?

更新1

config/initializers/session_store.rbケビンは私のファイルの内容を要求しました:

# Be sure to restart your server when you modify this file.

Calliope::Application.config.session_store :cookie_store, key: '_calliope_session'

# Use the database for sessions instead of the cookie-based default,
# which shouldn't be used to store highly confidential information
# (create the session table with "rails generate session_migration")
#Calliope::Application.config.session_store :active_record_store

rake db:migrate一番下の行のコメントを外した後、コマンドを再実行しようと:active_record_storeしましたが、結果は変わりませんでした。

また、DevデータベースとTestデータベースのどちらにも既存のテーブルがありません。sessions

4

2 に答える 2

1

生成されたSQLを見ると、これは飛び出します。

FOREIGN KEY ("session_id") REFERENCES "sessions" ("id"))

テーブル名はですが、という名前sessionsの別のテーブルのように見えるものを参照していますsessions。何らかの理由で、このテーブルの列が。という名前のテーブルの列session_idへの外部キーであることを示しています。idsessions

session_idしたがって、セッションテーブルのid列を同じテーブルの列への外部キーにすることはできないことは明らかです-エラーが示すように:

Key columns "session_id" and "id" are of incompatible types: character varying and integer.

ActiveRecord :: SessionStoreのドキュメントによると:

ActiveRecordクラスに裏打ちされたセッションストア。デフォルトのクラスが提供されていますが、テキストsession_idとdata属性を持つActiveRecordSessionクラスへのオブジェクトのダックタイピングで十分です。

このページへのリンクは次のとおりです。

http://apidock.com/rails/ActiveRecord/SessionStore

ファイルの内容を投稿でき/config/initializers/session_store.rbますか?

于 2012-05-17T02:40:43.227 に答える
1

上記のAndrewのアドバイスを使用して、 schema_plusライブラリのドキュメントを確認しました。これが、私の問題の原因です。

SchemaPlusは、外部キー制約のサポートを追加します。実際、外部キーであることを示すために接尾辞_idを付けて列に名前を付けるという一般的な規則では、SchemaPlusは適切な制約を自動的に定義します。

ありがたいことに、この動作は、:references => nil設定を使用することで移行でオーバーライドできます。詳細については、READMEを確認してください。

于 2012-05-19T17:52:19.963 に答える