【发布时间】:2021-08-10 04:18:35
【问题描述】:
Rails 5.2.1
我有一个 Postfix 邮件服务器,根据flurdy.com 的指南设置。它在后端使用 MySQL 来跟踪虚拟域、用户并将别名映射到用户帐户。我正在尝试在它使用的 MySQL 表上放置一个不错的 Rails 前端。
Flurdy's method 使用名为“id”的字段来存储用户的电子邮件地址。当然,我的问题是 Rails 喜欢使用“id”作为表的主键。我找到了使用不同主键的指南,但即使在我的用户表上执行db:migrate 并在模型中指定它应该使用“pkid”作为主键,而不是给我一个电子邮件地址列表,我获取 pkid 的值。 MySQL 中的电子邮件地址是正确的。
这里是用户表迁移的相关sn-p:
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users, id: false do |t|
t.primary_key :pkid
t.string :id
t.string :name
. . . skip . . .
t.timestamps
end
end
end
这是用户模型:
class User < ApplicationRecord
self.primary_key = 'pkid'
end
当我调用 users#index:
时,预期的行为会是这样的pkid id name
1 this@example.com This User
2 that@example.com That User
3 theother@example.com Someone Else
而我看到的是:
pkid id name
1 1 This User
2 2 That User
3 3 Someone Else
感谢您的帮助。
编辑:我在上面设置了一个链接,指向 Flurdy 的设置 Postfix 以在 GNU/Linux 上为虚拟域提供服务的指南。它使用 MySQL 来存储用户、域和别名信息,有时会替换 /etc/postfix 目录中的哈希表,为这个问题添加一些上下文。
【问题讨论】:
-
直译为
id是一个糟糕的计划。在用户表上执行此操作尤其糟糕。 -
Flurdy 的方法如何与 Rails 集成?这个“id”值在哪里使用?
-
@tadman (1) 计划不好?适当地指出,但这种设置可以追溯到几年前,我想尝试使用 Rails 应用程序来管理它。 (2) 它如何与 Rails 集成?它没有。这是我决定独立于他的(众所周知的)Postfix howto 指南做的事情。解释将占用比此评论更多的空间。
-
您有机会在接口处将
id映射到实际存储在记录中的其他内容,或者使您的数据库记录导出一个兼容的结构。例如,to_flurdy可以返回一个带有{ id: ..., ... }的 Hash 来表示预期的形式。如果您需要一个带有可以调用的方法的成熟对象,您可以将其简单地包装在OpenStruct中,以便obj.id工作。 -
@tadman 我目前的计划是复制“id”列并将其命名为“email”,然后测试修改引用该字段的所有配置/查询。在最坏的情况下,我必须使两列保持同步。充其量我可以删除“id”列并为那些想要做类似事情的人发布一个Github指南。
标签: mysql ruby-on-rails postfix-mta