出于什么目的,我可能需要使用连接表?
例如,当我运行时rails g migration CreateJoinTable products suppliers
,它会使用products_id和suppliers_id列创建相应的products_suppliers表.此外,默认情况下,这些字段的选项设置为false.为什么需要这些领域?它们用于什么?什么是null选项?:null
提前致谢.
这是标准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"
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
这个问题是它只允许你关联单个记录; 如果你想关联multiple(many-to-many
),你需要一个连接表.
Rails join tables
用于has_many :through
和has_and_belongs_to_many
关系......
加入表中含有(至少)primary key
&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
关联,则必须使用连接表来存储对相对外键的所有引用.