加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用多态反转has_many

发布时间:2020-12-17 03:14:17 所属栏目:百科 来源:网络整理
导读:我有两个模型:用户和项目.这个想法是用户可以关注项目和其他用户.当然,用户和项目是多态“可跟随”类型的一部分.现在,使用用户模型,我想得到三件事: user.followed_usersuser.followed_projectsuser.followers 前两个工作正常;这是我遇到麻烦的第三个问题.
我有两个模型:用户和项目.这个想法是用户可以关注项目和其他用户.当然,用户和项目是多态“可跟随”类型的一部分.现在,使用用户模型,我想得到三件事:

user.followed_users
user.followed_projects
user.followers

前两个工作正常;这是我遇到麻烦的第三个问题.这是一种反向查找,其中外键成为下表中的“followable_id”列,但无论我如何建模,我都无法使查询正确运行.

用户模型

has_many :follows,:dependent => :destroy
has_many :followed_projects,:through => :follows,:source => :followable,:source_type => "Project"
has_many :followed_users,:source_type => "User"
has_many :followers,:as => :followable,:foreign_key => "followable",:source => :user,:class_name => "User"

关注模型

class Follow < ActiveRecord::Base
  belongs_to :followable,:polymorphic => true
  belongs_to :user
end

我的下表有:
?用户身份
?followable_id
?followable_type

每当我运行查询时,我得到:

SELECT `users`.* FROM `users` INNER JOIN `follows` ON `users`.`id` = `follows`.`user_id` WHERE `follows`.`user_id` = 7

它应该是“followable_id = 7 AND followable_type =’User”,而不是“user_id = 7”

有什么想法吗?

解决方法

弄清楚了.看一下 sample project Michael Hartl made并注意到这样做的正确方法是不仅要指定一个关系表(在这种情况下是跟随),还要指定一个反向关系表(后面我称之为反向关系).

has_many    :follows,:dependent => :destroy

    has_many    :followed_projects,:source_type => "Project"

    has_many    :followed_users,:source_type => "User"

    has_many    :reverse_follows,:foreign_key => :followable_id,:class_name => "Follow"

    has_many    :followers,:through => :reverse_follows,:source => :user

希望这能帮助一些人走出困境!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读