美文网首页ruby on rails
术-机制:使用rails中间表的注意事项

术-机制:使用rails中间表的注意事项

作者: 稻草人_b788 | 来源:发表于2019-07-08 19:19 被阅读0次

    一、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。

    相关文章

      网友评论

        本文标题:术-机制:使用rails中间表的注意事项

        本文链接:https://www.haomeiwen.com/subject/zcoahctx.html