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

Bil*_*gan 4 ruby-on-rails ruby-on-rails-4

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

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

提前致谢.

Ric*_*eck 12

这是标准relational database功能.

-

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

在此输入图像描述

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


在Rails的情况下,数据库中的"关系"由ActiveRecord- ORM(对象关系映射器)维护.这意味着从应用程序层开始,您只需要关注填充对象:

@user = User.find x
@user.products #-> outputs records from "products" table with foreign key "user_id = x"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这个问题是它只允许你关联单个记录; 如果你想关联multiple(many-to-many),你需要一个连接表.


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

在此输入图像描述

加入表中含有(至少)primary key&foreign key的关系.例如...

user_id | product_id
   1    |     3
   1    |     5
   2    |     3
Run Code Online (Sandbox Code Playgroud)

这允许你打电话:

#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
Run Code Online (Sandbox Code Playgroud)

简而言之,如果要拥有has_many <-> has_many关联,则必须使用连接表来存储对相对外键的所有引用.