gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:34:42 24 4
gpt4 key购买 nike

我正在编写一个显示家谱的小狗数据库。我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com