出于什么目的,我可能需要使用连接表?
例如,当我运行rails g migration CreateJoinTable products suppliers
时,它会使用 products_id 和 suppliers_id 列创建相应的 products_suppliers 表。此外,默认情况下,这些字段的选项:null
设置为false。为什么需要这些领域?它们用于什么?什么是null选项?
提前致谢。
答案 0 :(得分:12)
这是标准的relational database
功能。
-
Rails是在关系数据库(通常是MYSQL或PGSQL)之上设计的,这基本上意味着您可以通过使用foreign keys来引用“关联”数据:
在关系数据库的上下文中,外键是一个表中的一个字段(或字段集合),用于唯一标识另一个表的行
对于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
这个问题是它只允许你关联单个记录;如果您想关联多个(many-to-many
),则需要join table。
Rails使用join tables
用于has_many :through
和has_and_belongs_to_many
关系...
加入表格(至少)填充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
关联,则需要连接表来存储对相对外键的所有引用。