我想修改Devise,使其与带有PostgreSQL的UUID主键的用户表一起使用。
以下是迁移:
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table :users, id: false do |t|
t.uuid :uuid, null: false
# ...
end
change_table :users do |t|
t.index :uuid, unique: true
# ...
end
end
def migrate(direction)
super
if direction == :up
# This is only necessary because the following does not work:
# t.uuid :uuid, primary: true, null: false
execute "ALTER TABLE users ADD PRIMARY KEY (uuid);"
end
end
end
以下是User
型号:
class User < ActiveRecord::Base
primary_key = :uuid
devise :database_authenticatable, :recoverable, :registerable,
:rememberable, :trackable, :validatable
validates :uuid, presence: true
before_validation :ensure_uuid
def ensure_uuid; self.uuid ||= SecureRandom.uuid end
end
这是错误:
PG::Error: ERROR: operator does not exist: uuid = integer
LINE 1: ...ECT "users".* FROM "users" WHERE "users"."uuid" = 1 ORDER...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT "users".* FROM "users" WHERE "users"."uuid" = 1 ORDER BY "users"."uuid" ASC LIMIT 1
Extracted source (around line #5):
1 .navbar-inner
2 .container
3 = a_nav_tag "App", root_path
4 - if user_signed_in?
5 %ul.nav.pull-right
6 %li.dropdown#user_menu
7 %a.dropdown-toggle(data-toggle="dropdown" href="#")
如您所见,user_signed_in?
已被破坏。我希望从“正常”自动递增ID转换到UUID需要进行一些更改。
目前,我只是发布了这个问题。我今天晚些时候会在这个问题上采取行动。如果你碰巧知道怎么做 - 或者知道一个Devise分叉,我会很感激。
答案 0 :(得分:8)
我在Rails 4中完成了这一操作,只需在创建表时将id列设置为uuid数据类型,并且没有其他配置发生任何变化。即。不要创建名为'uuid'的列,只需将'id'列的类型更改为uuid。
答案 1 :(得分:3)
只需清除浏览器的网络应用Cookie(在我的情况下为localhost
)。导致上述错误的原因是会话保留了旧用户主键1
。
之后,事情在我的测试中起作用。我希望这不仅仅是运气,如果Devise对主键不可知,这将是一个很好的设计。 (在Devise的代码中,除了在某些测试中,我没有使用.id
。)
答案 2 :(得分:0)
2020年答案:
在创建用户表时,将ID设置为uuid
def change
enable_extension 'pgcrypto' # needed if not already enabled
create_table :users, id: :uuid do |t|
t.string :email,
...