在Rails中使用join表有什么用?

时间:2016-01-02 11:04:02

标签: ruby-on-rails ruby-on-rails-4

出于什么目的,我可能需要使用连接表?

例如,当我运行rails g migration CreateJoinTable products suppliers时,它会使用 products_id suppliers_id 列创建相应的 products_suppliers 表。此外,默认情况下,这些字段的选项:null设置为false。为什么需要这些领域?它们用于什么?什么是null选项?

提前致谢。

1 个答案:

答案 0 :(得分:12)

这是标准的relational database功能。

-

Rails是在关系数据库(通常是MYSQL或PGSQL)之上设计的,这基本上意味着您可以通过使用foreign keys来引用“关联”数据:

enter image description here

  

在关系数据库的上下文中,外键是一个表中的一个字段(或字段集合),用于唯一标识另一个表的行

对于Rails,数据库中的“关系”由ActiveRecord - ORM (Object Relational Mapper)维护。这意味着从应用程序层开始,您只需要专注于填充对象:

@user = User.find x
@user.products #-> outputs records from "products" table with foreign key "user_id = x"

ActiveRecord管理您的关联,这就是您必须在模型中定义belongs_to / has_many指令等的原因。

您创建的大多数关联将直接引用其他表:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :products
end

#app/models/product.rb
class Product < ActiveRecord::Base
   belongs_to :user
end

enter image description here

这个问题是它只允许你关联单个记录;如果您想关联多个(many-to-many),则需要join table

Rails使用join tables用于has_many :throughhas_and_belongs_to_many关系...

enter image description here

加入表格(至少)填充primary key&amp; foreign key关系。例如......

user_id | product_id
   1    |     3
   1    |     5
   2    |     3

这允许您致电:

#app/models/user.rb
class User < ActiveRecord::Base
   has_and_belongs_to_many :products
end

#app/models/product.rb
class Product < ActiveRecord::Base
   has_and_belongs_to_many :users
end

@user.products #-> all products from join table
@product.users #-> all users from join table

简而言之,如果您想要has_many <-> has_many关联,则需要连接表来存储对相对外键的所有引用。