基于现有列创建ActiveRecord关联时外键设置异常求助
解决Rails外键关联到错误列的问题
我来帮你搞定这个外键关联的问题——看起来你想让listings表的user_id关联到users表的user_id列,但Rails默认关联到了users的主键id,问题出在模型和迁移的配置细节上,分两种常见情况给你解决方案:
情况1:users表的主键就是user_id(而非默认的id)
如果你的users表设计时把user_id设为主键,那首先需要在User模型里显式声明主键,否则Rails会默认用id:
class User < ApplicationRecord self.primary_key = 'user_id' # 告诉Rails这张表的主键是user_id has_many :listings end
Listing模型的配置没问题,但如果之前的迁移已经错误创建了外键,你需要先删除旧的外键再重新添加:
class FixListingForeignKey < ActiveRecord::Migration[5.1] def change # 先移除错误的外键(如果之前已经创建过) remove_foreign_key :listings, :users # 重新添加正确的外键,明确指定引用users表的user_id列 add_foreign_key :listings, :users, column: :user_id, primary_key: :user_id end end
运行迁移后,外键就会正确关联到users.user_id了。
情况2:users表的主键还是id,但要关联users.user_id(非主键列)
这种情况需要先确保users.user_id是唯一的(外键必须引用唯一列),先给users表的user_id添加唯一索引:
class AddUniqueIndexToUsersUserId < ActiveRecord::Migration[5.1] def change add_index :users, :user_id, unique: true end end
然后调整两个模型的关联配置,明确指定关联的列:
class User < ApplicationRecord # 告诉Rails用user_id列去关联listings的user_id has_many :listings, primary_key: 'user_id', foreign_key: 'user_id' end class Listing < ApplicationRecord belongs_to :user, foreign_key: 'user_id' end
最后调整迁移文件,添加正确的外键:
class AddFkToListing < ActiveRecord::Migration[5.1] def change add_foreign_key :listings, :users, column: :user_id, primary_key: :user_id end end
运行迁移后,外键就会正确指向users.user_id列了。
验证方法
你可以打开数据库控制台,查看listings表的外键约束,比如用PostgreSQL的话,执行\d listings,就能看到外键关联的目标列是不是users.user_id了。
内容的提问来源于stack exchange,提问作者Maayan Naveh
相关产品推荐
相关产品推荐

