gpt4 book ai didi

ruby-on-rails - Ruby on Rails has_many通过自引用跟随/从属关系

转载 作者:行者123 更新时间:2023-12-03 11:40:35 25 4
gpt4 key购买 nike

在has_many:through上有许多帖子和主题,但是我还没有发现任何内容专门涵盖我想做的事情。

我有一个用户模型和一个友谊模型。一个用户有许多关注他们的用户以及许多关注者。这是通常的Twitter模式。

对于给定的用户,我想设置Active Record关系,以返回跟随该用户且该用户是其关注者的实际用户。

这些是我设置的关系:

class User < ActiveRecord::Base

has_many :following, :class_name => 'User', :through => :friendships, :foreign_key => 'user_id'

has_many :followers, :class_name => 'User', :through => :friendships, :foreign_key => 'friend_id'

end

class Friendship < ActiveRecord::Base

belongs_to :user
belongs_to :following, :class_name => 'User', :foreign_key => 'friend_id'
belongs_to :follower, :class_name => 'User', :foreign_key => 'user_id'

end

以下关系有效-生成以下联接:
SELECT `users`.* FROM `users` INNER JOIN `friendships` ON `users`.id = `friendships`.friend_id WHERE ((`friendships`.user_id = 1))

一切都是宏伟的。

但是,关注者关系不起作用。我已经尝试了多种变体,但是大多数变体似乎返回的结果与“跟随”相同。

我需要按如下所示设置联接以返回正确的结果集。
SELECT `users`.* FROM `users` INNER JOIN `friendships` ON `users`.id = `friendships`.user_id WHERE ((`friendships`.friend_id = 1)); 

我要去哪里错了?

我可以使用has_many上的finder_sql选项进行设置,但似乎应该有更好的方法。
has_many :followers, :class_name => 'User', :finder_sql => 'SELECT `users`.* FROM `users` INNER JOIN `friendships` ON `users`.id = `friendships`.user_id WHERE ((`friendships`.friend_id = #{ id }))'

谢谢!

我取得了一些进展,最终通过将关系分为两部分来使关系正常工作,如以下响应所示: Self-referential has_many :through with customized :primary key issue
# FOLLOWING
has_many :friendships_to, :foreign_key => 'user_id', :class_name => 'Friendship'
has_many :following, :through => :friendships_to, :class_name => 'User'

# FOLLOWERS
has_many :friendships_from, :foreign_key => 'friend_id', :class_name => 'Friendship'
has_many :followers, :through => :friendships_from, :class_name => 'User'

但是,虽然可以为该关系提供单行版本
has_many :following, :class_name => 'User', :through => :friendships, :foreign_key => 'user_id'

我仍然无法将其用于追随者。还在想如何做到这一点?

最佳答案

您需要确保ActiveRecord知道User#friends和跟随者的源关联是什么,并为ActiveRecord无法从关联名称推断出的关系指定类和foreign_key。

class Following < ActiveRecord::Base

belongs_to :user
belongs_to :followed, :class_name => 'User'

end

class User < ActiveRecord::Base

has_many :followings
has_many :friends, :through => :followings, :source => 'followed'

has_many :followeds, :class_name => 'Following', :foreign_key => 'followed_id'
has_many :followers, :through => :followeds, :source => :user

end

关于ruby-on-rails - Ruby on Rails has_many通过自引用跟随/从属关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6762919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com