一旦它们存在,你如何实际使用连接表?

时间:2014-10-24 11:24:41

标签: ruby-on-rails

我的数据库存储了一个人员列表,以及他们拥有的宠物。

rails generate model Pet name:string species:string
rails generate model Owner name:string

应用程序/模型/ owner.rb

has_many :pets

应用程序/模型/ pet.rb

belongs_to :owner

然后我运行rake db:migrate,然后进入Rails控制台试一试。

Owner.create name: "Sarah"
Owner.create name: "David
santos = Pet.new name: "Santos L Halper", species: "Dog"

现在我想告诉Rails谁拥有桑托斯。我如何实际执行此操作,如何在联接中表达关系?

我认为它可能是santos.owner = Owner.find(1),但不是。我的书实际上并没有解决这个问题,他们似乎只是假设这种关系神奇地存在。我真的很沮丧,因为我整个晚上都在这上面并且无处可去,无法在任何地方找到这些信息。

2 个答案:

答案 0 :(得分:0)

您缺少的是在Pet模型中通过rails迁移创建外键。如果遵循约定,则应将数据库中的列称为owner_id
运行迁移后,您在问题中编写的代码应该可以正常运行。

关于在何处查找信息:导轨指南非常有用。

以下是涵盖协会的内容:http://guides.rubyonrails.org/association_basics.html

针对您特定的has_many案例:http://guides.rubyonrails.org/association_basics.html#the-has-many-association

其他指南http://guides.rubyonrails.org/

答案 1 :(得分:0)

我认为您没有忘记将owner_id放入pets表。 然后,你可以这样做:

owner = Owner.find(1) // find some owner
pet = owner.pets.create(name: 'Santos', species: 'Dog')

并且该所有者与您的新宠物有关。您可以使用build代替create方法,但在这种情况下,您必须手动保存。此示例将宠物自动保存在数据库中。

<强>更新

现在,如果您想查看所有者的所有宠物,您将使用:

owner = Owner.find(1) // find some owner
pets = owner.pets

如果你有一些宠物,你可以找到所有者:

pet = Pet.find(1) // find some pet
owner = pet.owner