gpt4 book ai didi

ruby-on-rails - Rails/ActiveRecord 中不区分大小写的唯一索引?

转载 作者:行者123 更新时间:2023-12-03 11:31:17 26 4
gpt4 key购买 nike

我需要在 rails 的列上创建一个不区分大小写的索引。我是通过 SQL 做到的:

execute(
"CREATE UNIQUE INDEX index_users_on_lower_email_index
ON users (lower(email))"
)

这很好用,但在我的 schema.rb 文件中我有:
add_index "users", [nil], 
:name => "index_users_on_lower_email_index",
:unique => true

注意“零”。因此,当我尝试克隆数据库以运行测试时,出现明显错误。我在这里做错了吗?我应该在 rails 内使用其他一些约定吗?

谢谢您的帮助。

最佳答案

由于 MySQL 索引已经不区分大小写,我猜您正在处理 PostgreSQL,它默认创建区分大小写的索引。我在这里回答基于 Rails 3.2.3 和 PostgreSQL 8.4。

好像functional indexes是 ActiveRecord 无法生成的又一个例子。外键和 UUID 列是另外两个想到的。所以别无选择(除了猴子补丁 ActiveRecord),只能使用 execute声明。

这意味着要准确转储您的数据库,您需要放弃与 DB 无关的 schema.rb,转而使用特定于 DB 的 structure.sql。请参阅 Rails Guide on Migrations,部分 6.2 Types of Schema Dumps .这设置如下:

配置/应用程序.rb

config.active_record.schema_format = :sql

运行迁移时 db/structure.sql 应自动更新。您可以使用以下命令手动生成它:
rake db:structure:dump

该文件是纯 Postgres SQL。虽然在您使用 rake -T 时没有记录在案要列出 rake 任务,似乎可以使用此命令从 structure.sql 转储中加载数据库:
rake db:structure:load

这里没有什么神奇之处: source code (此处显示来自 Rails 3.2.16)只是在 structure.sql 上调用 psql。

最后,这是我删除旧的、区分大小写的电子邮件约束并添加区分大小写的功能索引的迁移:
class FixEmailUniqueIndexOnUsers < ActiveRecord::Migration
def up
remove_index :users, :email
execute "CREATE UNIQUE INDEX index_users_on_lowercase_email
ON users USING btree (lower(email));"
end

def down
execute "DROP INDEX index_users_on_lowercase_email;"
add_index :users, :email, :unique => true
end
end

关于ruby-on-rails - Rails/ActiveRecord 中不区分大小写的唯一索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com