多对多关系

多对多的关系是对称的关系,两个连接的表都互相使用has_and_belongs_to_many来声
明它们之间的关系。
在数据库中,多对多关联是使用中间连接表来实现的。它包含一对外键连接两个目标表。
Active Record假定这个连接表的名字是两个目标表名以字母顺序串联起来。在前面例子中,
我们连接表categories和表products, Active Record会去找一个名为categories_products的连接表。

注意:我们的连接表没有id这个列。这其中有两个原因,第一,它不需要-记录行已经
有两个定义好了的唯一外键。我们在DDL是这样定义表。
create table categories_products (
category_id int not null,
product_id int not null,
constraint fk_cp_category foreign key (category_id) references
categories(id),
constraint fk_cp_product foreign key (product_id) references
products(id),
primary key (category_id, product_id)
);

第二个原因是Active Record在访问记录行自动会包括连接表的所有列。如果连接表包
括一个id的列,它的id就会覆盖掉被连接表记录行的id.这个以后我们还会说。

[color=red]has_and_belongs_to_many() 声明[/color]
has_and_belongs_to_many(用habtm来代替吧,太长了)在很多方面和has_many都很
像。habtm创建了一个属性,本质上就是个集合。这个属性支持很多和has_many一样的方法 。
另外,当关联两个对象时,habtm允许你给连接表加入信息。让我们举个列子。
也许我们使用Rails写一个社区站点,用户可以阅读文章。可能有很多用户,很多文章,
并且任何用户可以阅读任何文章。为了跟踪,我们想知道读每篇文章的是谁,以及每个人读
的是什么文章。还想知道一个用户读一篇文章的最后时间。我们只要一个简单的连接表就行
了。

我们创建两个model类,以便于通过这个表连接它们。
class Article < ActiveRecord::Base
has_and_belongs_to_many :users
# ...
end

class User < ActiveRecord::Base
has_and_belongs_to_many :articles
# ...
end
这允许我们做些事情,如列出阅读过文章123的用户和由pragdave读过的所有文章。
# Who has read article 123?
article = Article.find(123)
readers = article.users
# What has Dave read?
dave = User.find_by_name("pragdave")
articles_that_dave_read = dave.articles

当我们应用程序注意到有人已经在读一篇文章时,它会把用户记录和这个文章连接在一
起。我们将使用User类中的一个实例方法来做这件事。

class User < ActiveRecord::Base
has_and_belongs_to_many :articles
def read_article(article)
articles.push_with_attributes(article, :read_at => Time.now)
end
# ...
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值