ruby-on-rails - 为引用自己表的外键创建 Rails 5 迁移

标签 ruby-on-rails postgresql ruby-on-rails-5 rails-activerecord rails-migrations

我正在编写一个显示家谱的小狗数据库。 我有一个 postgresql 表 'dogs',它有 dog_id、名称、体重等。 我还希望它有一个存储另一个 dog_id 的 mother_id 和 father_id。

首先,这是否有效? 我将如何为 Rails5 编写该迁移?

或者我应该有另一个表“亲子关系”来将狗彼此联系起来吗?

最佳答案

我不同意 neongrau。您不需要第二张表来实现此目的。这可以通过在您的 dogs 表中进行动态自连接来完成。您首先要在单个模型中声明所有关系,并分别声明它们的外键:

模型/狗.rb:

class Dog < ActiveRecord::Base
  belongs_to :mom, class_name: "Dog", foreign_key: "mom_id"
  belongs_to :dad, class_name: "Dog", foreign_key: "dad_id"
  has_many :kids, class_name: "Dog"
end

然后您将运行一个引用妈妈和爸爸的迁移:

class CreateDogs < ActiveRecord::Migration
  def change
    create_table :dogs do |t|
      t.string :name
      t.integer :age
      t.references :mom
      t.references :dad
      t.integer :dog_id

      t.timestamps null: false
    end
end

现在我们通过手动建立关联来测试它:

   kid = Dog.create(name: "Rover")
    => #<Dog id: 8, name: "Rover"..>

   ma = Dog.create(name: "Susie")
   => #<Dog id: 2, name: "Susie"..>

   pa = Dog.create(name: "Doug")
   => #<Dog id: 8, name: "Doug"..>

kid.mom_id = 2
kid.save

kid.mom
 => #<Dog id: 2, name: "Susie"...>

kid.dad_id = 3
kid.save

kid.dad
 => #<Dog id: 3, name: "Doug"...>


ma.kids << kid
ma.save

ma.kids
 => #<Dog id: 1, name: "Rover"...>

pa.kids << kid 
pa.save

pa.kids
 => #<Dog id: 1, name: "Rover"...>

现在您拥有动态关系,其中狗可以有多个 child ,并且可能属于母亲和父亲。

关于ruby-on-rails - 为引用自己表的外键创建 Rails 5 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46941485/

相关文章:

ruby-on-rails - Ruby 和 Ruby on Rails Windows 安装程序修改了哪些注册表值?

ruby-on-rails - Rails Acts_as_votable平均条形图

mysql - 不确定的排序顺序 - MySQL 与 Postgres

nginx - RoR 5.0.0 ActionCable wss WebSocket 握手 : Unexpected response code: 301

ruby-on-rails - 有没有什么方法可以在不查询/少查询的情况下了解数据库更新?

ruby-on-rails - 使用 Active Storage Image 获取 MD5 哈希

ruby-on-rails - 本地化月份名称 - 日历 Railscasts #213

ruby-on-rails - Time.now.to_i 在 heroku 和本地不同

python - 类型错误 : get_bind() got an unexpected keyword argument

postgresql - PostgreSQL 配置文件的备用位置