我有以下两种型号:

class Store < ActiveRecord::Base
    belongs_to :person
end

class Person < ActiveRecord::Base
    has_one :store
end

问题是:我正在try 创建一个迁移,以便在people表中创建外键.然而,引用Store外键的列并不像rails惯例那样被命名为store_id,而是被命名为foo_bar_store_id.

如果我遵循rails惯例,我会这样做:

class AddReferencesToPeople < ActiveRecord::Migration
  def change
    add_reference :people, :store, index: true
  end
end

但是,这将不起作用,因为列名不是store_id,而是foo_bar_store_id.那么,如何指定外键名只是不同,但仍然保持index:true以保持快速性能呢?

推荐答案

EDIT: For those that see the tick and don't continue reading!

而这个答案实现了一个非常规外键列名的目标,索引为it does not add a fk constraint to the database.请参阅其他答案,了解使用add_foreign_key和/或"添加参考"更合适的解决方案.

注意:总是看其他答案,被接受的答案并不总是最好的!

原始答案:

AddReferencesToPeople迁移中,可以使用以下方法手动添加字段和索引:

add_column :people, :foo_bar_store_id, :integer
add_index :people, :foo_bar_store_id

然后让模型知道外键,如下所示:

class Person < ActiveRecord::Base
  has_one :store, foreign_key: 'foo_bar_store_id'
end

Ruby-on-rails相关问答推荐

链轮轨道V4链接到外部Ruby 的 list 文件

使用ActiveSupport::TimeWithZone将UTC转换为用户定义的时区

尽管安装并需要 pry-rails gem,但 Rails 容器内出现未定义方法‘pry’错误

获取所有属于模型的嵌套对象

如何从数组中提取值

如何验证 Rails 中的多态字段关联?

Rails - Comment.count没有改变1

File.open,写入和保存?

渲染:动作和渲染:模板之间的区别

是否可以在 Rails 集成测试或规范中指定用户代理?

在 ID 存在时获取表的未知主键

在 rake 任务期间关闭观察者的简单方法?

如何打印出范围之间的随机数?

设计:在注册期间禁用密码确认

Rspec:如何在控制器规范中分配实例变量

使用 ruby​​ on rails 活动记录插入多条记录

如何在 rake 任务中强制 RAILS_ENV?

如何使用 url 连接到 postgresql

将新管理员添加到活动管理员

如何为 Rails 控制器添加延迟以进行测试?