术-机制:使用rails中间表的注意事项
2019-07-08 本文已影响0人
稻草人_b788
一、rails中的中间表
在表示多对多关系时,我们经常会借助中间表来表示这一关系。
(一)案例1:用户与评论
当我们表达购物车和商品间的关系时,会用到中间表,这个中间表是第三张表。
一个购物车中可以有多种商品,而一种商品也可以放到多个购物车中。此时我们可以建立两者间的多对多关系:
class CartItem < ApplicationRecord
#中间表,可理解为购物车中的栏位
belongs_to :cart
belongs_to :product
end
class Cart < ApplicationRecord
#购物车
has_many :cart_items
has_many :products,through: :cart_items
end
class Product < ApplicationRecord
#商品
has_many :cart_items
has_many :carts,through: :cart_items
end
(二)案例2:用户关注
当我们在表述用户关注关系时,也会借助中间表,有所不同的是"我关注的"和"关注我的"都在同一张users表,所以这里只有两张表的关系:
class User < ApplicationRecord
#表述我关注的人
has_many :active_relationships,class_name: "Relationship",foreign_key: "follower_id"
has_many :following,through: :active_relationships,source: :followed
#表述关注我的人
has_many :passive_relationships,class_name: "Relationship",foreign_key: "followed_id"
has_many :followers,through: :passive_relationships,source: :follower
end
class Relationship < ApplicationRecord
belongs_to :follower,class_name: "User"
belongs_to :followed,class_name: "User"
end
需要注意的是:
这里之所以要把relationships划分为active_relationships和passive_relationships,是因为在同一个model中如果根据follower_id和followed_id去分别查找“我关注的人”和“关注我的人”,都使用了相同的关系名relationships,那么后面一个定义会覆盖前面一个,即follower_id去找用户的那个relationships将会始终返回空数组而找不到正确的数据。例如:
has_many :relationships,foreign_key: "follower_id" #被下面一个关系覆盖,这个关系查找到的资料将始终为空数组
has_many :relationships,foreign_key: "followed_id"
因此这里需要区分这两种查找关系分别为active_relationships和passive_relationships。