介绍: model多对多关系,有两种方法可以实现,第一种是has_and_belongs_to_many,第二种是has_many,下面分别分析一下
has_and_belongs_to_many
使用场景:一个a模型有多个b模型,b模型同样也有多个a模型
举个例子:一个博客有多个标签,一个标签也有多个博客,博客为blog模型,标签为tag模型,如何实现blog模型和tag模型的对应关系
blog模型中
has_and_belongs_to_many :tags
tag模型中
has_and_belongs_to_ many :blogs
要想要建立blog个模型和tag模型之间的关心,必须要有个对应关系表blogs_tags
表中建立字段
t.integer :blog_id
t.integer :tag_id
到这里我们已经建立了blog模型和tag模型的关系呢。
has_many
使用场景:我们需要访问关联关系表blogs_tags,并且在关联关系表blogs_tags中添加一些自定义的字段,回调,属性检查等等
举个例子:一个博客有多个标签,一个标签也有多个博客,博客为blog模型,标签为tag模型,如何实现blog模型和tag模型的对应关系
blog模型中
has_many :blogs_tags, class_name: "BlogTag"
has_many :tags, through: :blogs_tags
tag模型中
has_ many :blogs_tags, class_name: "BlogTag"
has_many :blogs, through: :blogs_tags
blogs_tags模型中
self.table_name = "blogs_tags"
belongs_to :blog
belongs_to :tag
对应关系已经建立起来呢。
关联关系定制
使用场景:我们需要返回只有是公开状态下的数据记录
举个例子:user模型和blog模型是一对多的关系,假如blog模型中is_public属性是boolean类型的,取出一个用户对应blog模型is_public为true时的所有数据
user模型中:
has_many :public_blogs, ->{ where(is_public: true) }, class_name: "Blog"