理解ActiveRecord的关联

理解ActiveRecord的关联
初学Rails时,觉得ActiveRecord很神奇,只要在model类中写上has_many, belongs_to等声明,就可方便地引用关联对象.这些关联声明还有很多选项,但开始并不理解(尤其对从未使用过ruby语言的人),只知道模仿着教程中的例子(以下的教程都指那本经典书:Agile web development with Rails)使用默认的选项.但是做实际项目时会发现默认选项不够用了,该怎么办?通过下面一个实际项目开发中的例子,就能真正理解model类的关联是怎么回事了.

场景:一个活动发布网站,要实现计划的发布和用户报名功能.报名还要分为已批准和待批准两种状态.
建模:(为表述方便对各表只列举最重要和有代表性的几个字段)很自然地首先会建立两个数据库表:users,plans.
users包含字段 id, name, password
plans包含字段 id, content, created_at (该记录创建时间,按 Rails 的约定该字段能自动维护), user_id (关联到users表,表示该计划的作者)

为了建立最基本的关联,只需要在模型文件中增加一个has_many和belongs_to:
# user.rb
class User < ActiveRecord::Base
has_many :plans
end
# plan.rb
class Plan < ActiveRecord::Base
belongs_to :user
end
增加这些声明的好处是什么?就是将来我得到一个plan对象时,可以用plan.user访问它的作者的信息;得到一个user对象时,可以用user.plans访问他发布的所有计划.多么简单!现在我要实现报名的功能了.
所谓报名,就是在plan和user之间再建立一种关联.这次是典型的多对多关联,因为一个计划可以有多个用户报名,而一个用户也可以报名参加多个计划.
多对多关联?教程上不是有介绍吗?马上模仿着建立一个关联表plan_user.包含字段 plan_id, user_id.
再按教程修改user.rb和plan.rb,增加相应的has_many:
# plan.rb
class Plan < ActiveRecord::Base
belongs_to :user
has_and_belongs_to_many : users
end
# user.rb
class User < ActiveRecord::Base
has_many :plans
has_and_belongs_to_many : plans
end
等等,User.rb里面怎么出现两个plans了,以后使用user.plans时到底是哪一个?静下来想一想,原来第一个has_many :plans表示一个用户发布的多个计划,第二个表示一个用户参加的多个计划.它们关联的对象虽然相同,但在业务逻辑上的意义是不同的.可是在代码中如何表示这种不同呢?我开始查关联的选项,发现有这么几个可用的选项:
:class_name, :join_table. 也就是说我可以改变关联的名称,但仍然关联到同一个表,修改如下:
# user.rb
class User < ActiveRecord::Base
has_many :plans
 has_and_belongs_to_many :plans_participated, :class_name => "lan"
end
这样一来,我就可以用user.plans来访问用户发布的计划,用user.plans_participated来访问用户参加的计划了.类似地,我修改了plan.rb中关联的名称以便我可以用plan.participants而不是plan.users来访问一个计划的所有参与者:
# plan.rb
class Plan < ActiveRecord::Base
belongs_to :user
has_and_belongs_to_many :participants, :class_name => "User"
end
做到这里,我们稍微总结回味一下就不难发现,其实关于关联的各种声明就相当于给你的模型类动态增加属性,而has_many,belongs_to等声明其实是来自于ActiveRecord基类的一些方法,后面的选项是传给这些方法的参数.这些方法一被执行,就会给你的模型类动态增加一些属性.(在 Ruby的类定义里可以直接执行一些语句,就象HTML中写在

你可能感兴趣的:(理解ActiveRecord的关联)