如何在两个表上执行has_many关系?

时间:2017-04-24 14:15:55

标签: ruby-on-rails associations

我尝试与创建表格进行has_many关系,并将其添加到已创建的另一个表格中。

我的User表已经没有任何关系。

我想创建一个关系为has_many Pro_user的{​​{1}}。

问题是一个User可以有多个User而一个Pro_user也可以有多个Pro_user

所以两个表都需要User对吗?

所以我想到的是那个

has_many

但这不是正确的事,它从rails g model pro_user name:string email:string password_digest:string user:referencesbelongs_to

进行Pro_user

我还应该如何在现有的表User上添加has_many呢?我是否必须进行迁移才能重新创建表并添加关系?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

多对多关联的推荐方法是" has_many_through"做法。如果您需要更多数据,这允许您稍后在连接表中添加其他列。您需要一个连接表,该表至少会有两个参考列到您的Users和ProUsers表以及标准ID列。 (参见:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

因此,您的User和ProUser表中不会包含任何引用列。相反,你将创建一个名为BoatsAndPros的第三个表(无论你喜欢什么,都可以调用它)并做:

    create_table :boats_and_pros do |t|
      t.belongs_to :user, index: true
      t.belongs_to :pro_user, index: true
      t.timestamps
    end

然后在相应的boats_and_pros.rb模型文件中添加:

belongs_to :user
belongs_to :pro_user

user.rb文件中,您将添加:

 has_many :boats_and_pros
 has_many :pro_users, through: :boats_and_pros

在您的pro_user.rb模型文件中,您将添加

has_many :boats_and_pros
has_many :users, through: :boats_and_pros

两个关键要点是:

  • " oldschool" has_and_belongs_to_many方法仍然没有问题,但是这里没有像has_many_through方法那样增长的空间,你需要专门命名表pro_users_users,因为Rails希望这两个表按词汇顺序列出。
  • 一对多关系,例如您在原始尝试中最终得到的内容,将引用保留在其中一个表中,而多对多关系需要第三个连接表,如上所示。