Luc*_*Luc 2 ruby-on-rails ruby-on-rails-3
我正在试图找出关于铁轨关系的一些事情.我不久前已经发布了一个关于特定项目的问题,但我真的不明白在底层数据库中做了什么.
我有一个Project模型和一个Client模型.一个项目belongs_to :client=>我需要手动添加client_id项目表(带有迁移).
A Client has_many :projects=>我不需要在DB中做任何事情(没有迁移).这些project.client和client.projects方法都可用.
我有一个Group模型和一个User模型.
一个Group has_and_belongs_to_many :user
一个User has_and_belongs_to_many :group
然后我需要创建一个迁移联合打造的表一中user_id和group_id指针.
我真的没有看到rails和关系数据库之间的边界.为什么我有时需要添加外键但不总是?这个has_many关系是如何处理的,因为我没有在底层数据库中为这个特殊的人做任何事情?
我有时会丢失:)
感谢致敬,
吕克
对于has_many< - > belongs_toassoication,您定义一个项目belongs_to由一个客户端拥有().因此,该客户端有许多(has_many)项目.对于一个项目来确定它属于哪个客户端,它需要有一个client_id列,以便它可以查找它.client_id调用client方法时,Rails使用此列,如下所示:
Client.find(project.client_id)
Run Code Online (Sandbox Code Playgroud)
这就是你如何找到一个项目的客户端.该client_id列通常被称为外键,因为它的表中的唯一标识符("键")不是其原始的("外来").繁荣.
当你反过来调用时,找到客户端拥有的所有项目,例如client.projects,Rails就相当于:
Project.find_all_by_client_id(client.id)
Run Code Online (Sandbox Code Playgroud)
然后Project,它将根据表中的client_id字段返回与特定客户端关联的所有记录projects.
通过has_and_belongs_to_many关联(例如您的用户和组示例),您将声明该用户has_and_belongs_to_many :groups.
现在,如果它只是一个has_many :groups,那么外键将进入groups表中,或者如果它是一个belongs_to,它将进入users表中.要记住的好事:外键总是放在具有该键的模型表中belongs_to.
你也宣布了一个小组has_and_belongs_to_many :users,所以我们遇到了同样的问题.我们无法在users表中声明密钥,因为它不属于那里(因为用户有很多组,您需要存储用户所属的所有组ID)或者组表原因相同.
这就是为什么has_and_belongs_to_many我们需要创建所谓的连接表.该表有两个且只有两个字段(两个都是外键),一个用于关联的一侧,另一个用于另一个.要创建此表,我们将把它放在迁移的self.up方法中:
create_table :groups_users, :id => false do |t|
t.integer :group_id
t.integer :user_id
end
Run Code Online (Sandbox Code Playgroud)
这里有几点需要注意:
groups_users.:id选项,当给定值时false生成一个没有主键的表.连接表不需要主键,因为它的目的是将其他表连接在一起.group_id和user_id作为整数字段,就像我们在belongs_to关联上一样.然后,该表将跟踪哪些组具有哪些用户,反之亦然.
无需在users或groups表上定义其他列,因为连接表已受到控制.
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |