首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试将Rails设置为在Postgresql数据库中存储会话

尝试将Rails设置为在Postgresql数据库中存储会话
EN

Stack Overflow用户
提问于 2012-05-17 02:14:11
回答 2查看 1.8K关注 0票数 1

我有一个现有的Rails 3.2应用程序,我希望将会话存储在Postgresql数据库中。我在Stackoverflow上找到了本教程,并遵循了迭戈·皮诺的指示。

但是,当我进入rake db:migrate步骤时,我得到了以下错误:

错误:错误:外键约束"sessions_session_id_fkey“不能详细实现:键列"session_id”和"id“是不兼容的类型:字符变化和整数。

下面是它试图执行的SQL:

代码语言:javascript
复制
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"))

下面是自动创建的迁移:

代码语言:javascript
复制
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文件的内容:

代码语言:javascript
复制
# 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或测试数据库中都有一个现有的sessions表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-19 17:52:19

我使用上面安德鲁的建议检查了加号库的文档,下面是问题的根源:

SchemaPlus增加了对外键约束的支持。实际上,对于使用后缀_id命名列以表示它是外键的常见约定,SchemaPlus会自动定义适当的约束。

值得庆幸的是,在您的迁移中,可以使用:references => nil设置覆盖此行为。有关更多信息,请查看自述文件

票数 1
EN

Stack Overflow用户

发布于 2012-05-17 02:40:43

查看生成的SQL,这会跳出:

代码语言:javascript
复制
FOREIGN KEY ("session_id") REFERENCES "sessions" ("id"))

您的表名是sessions,但它引用的是另一个名为sessions的表。出于某种原因,它指示该表中的session_id列是名为sessions的表中的id列的外键。

因此很明显,它不能使会话表中的session_id列成为同一表中id列的外键--正如错误告诉您的:

代码语言:javascript
复制
Key columns "session_id" and "id" are of incompatible types: character varying and integer.

根据ActiveRecord::SessionStore的文档

由活动记录类支持的会话存储。提供了一个默认类,但是任何带有文本session_id和数据属性的活动记录会话类的对象鸭类型都足够了。

以下是到该页面的链接:

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

你能张贴你的/config/initializers/session_store.rb文件的内容吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10629054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档