【问题标题】:Rails use custom foreign_key name for t.referenceRails 使用自定义 foreign_key 名称作为 t.reference
【发布时间】:2023-02-23 02:50:16
【问题描述】:

我想为一个表使用自定义主键,并在其他表中引用该表。 但是我的代码出现rails PG::UndefinedColumn: ERROR: column "id" custom column 错误

模式.rb

  create_table 'memberships', id: false, primary_key: :rank, force: :cascade do |t|
    t.string 'rank'
    t.integer 'discount_rate'
    t.datetime 'created_at', precision: 6, null: false
    t.datetime 'updated_at', precision: 6, null: false
  end

  create_table 'members', force: :cascade do |t|
    t.references :membership, index: true, foreign_key: { on_delete: :cascade }
    t.string 'name'
    t.datetime 'created_at', precision: 6, null: false
    t.datetime 'updated_at', precision: 6, null: false
  end

会员.rb

class Membership < ApplicationRecord
  has_many :members, foreign_key: :membership_rank
  validates :rank, uniqueness: true
end

成员.rb

class Member < ApplicationRecord
  belongs_to :membership
  validates :name, length: { maximum: 30 }, uniqueness: true, presence: true
end  

我检查了rails c,发现我的member是用membership_id = 0创建的。

我如何修复我的member表的代码以引用membership表的rank列?

====

Rails + Postgres Relation Issue With Custom Foreign Key

Specifying column name in a "references" migration

我在谷歌上搜索,但这些答案不适用于我的代码。

感谢您的所有建议。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    references 会自动将“_id”添加到列名(您无法更改此行为)并将此列默认为 bigint 数据类型(您可以使用 type: 选项更改此设置)。

    知道这一点你可以使用

    t.references :membership, index: true, type: :string foreign_key: { on_delete: :cascade }
    

    并按如下方式配置您的模型:

    class Membership < ApplicationRecord
      has_many :members
    end
    class Member < ApplicationRecord
      belongs_to :membership, primary_key: :rank
    end  
    

    但我不推荐这样做,因为它非常尴尬且具有误导性。

    相反,您可以简单地手动添加列

    add_column :members, :membership_rank, :string # or whatever your data type is
    add_foreign_key :members, :memberships, column: :membership_rank, on_delete: :cascade
    add_index :members, :membership_rank
    

    然后在模型中

    class Member < ApplicationRecord
      belongs_to :membership, foreign_key: :membership_rank, primary_key: :rank 
    end  
    

    虽然这应该可以解决所提出的问题,但我建议考虑其他选项来解决这个问题,因为这种设置非常不合常规,将来很可能会导致更多问题。

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多