【问题标题】:How to override Rails' using "id" as a table's primary key?如何使用“id”作为表的主键覆盖 Rails'?
【发布时间】: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


【解决方案1】:

我假设 id 属性现在是 pkid 属性的别名。

要查看 id 列的值,您可以使用属性哈希:

    User.first.attributes["id"]

【讨论】:

  • 看起来应该可以了。试一试,看看我是否可以通过这种方式插入记录。谢谢!!
猜你喜欢
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2014-09-13
相关资源
最近更新 更多