【问题标题】:Has_and_belong_to_many relation with the same modelHas_and_belong_to_many 与同一模型的关系
【发布时间】:2015-07-25 11:36:34
【问题描述】:

我正在尝试使用同一模型实现has_and_belong_to_many 关系,但我不知道如何。

例如,用户应该能够关注其他用户。

另外,我在该模型中有多个相同模型的字段;我该如何给它取另一个名字?

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-4 mongoid ruby-on-rails-4.2


【解决方案1】:

有两种场景和两种不同的实现方式:


“朋友”模型

假设一个User 可以有多个:friends,其中每个朋友也是User 模型的对象。你可以这样做:

has_and_belongs_to_many :friends, class_name: 'User'

这告诉 Rails User 类的对象可以与自身具有多对多关系,如 friends。所以你可以这样称呼:

@user_a.friends
#=> [@user_x, @user_y, @user_z]  # Array of User Objects

@user_x.friends
#=> [@user_a, @user_b, @user_c]  # Array of User Objects

“追随者/追随者”模型

假设一个User 可以关注其他用户,也可以让其他用户关注他。这就是你将如何实现它:

has_many   :followers, class_name: 'User', inverse_of: :following
belongs_to :following, class_name: 'User', inverse_of: :followers

这告诉 rails 每个用户可以拥有许多 followers,这是一个由其他 User 对象组成的数组,并且该用户可以作为 following 数组中的对象被其他人访问。例如,如果@user2 跟在@user1 之后,则如下所示:

@user1.followers
#=> [@user2, @user3]

@user2.following
#=> [@user1]

【讨论】:

  • 我总是被inverse_of 选项卡住...你能澄清一下它的作用吗?
  • +1 了解更多详情。从技术上讲,inverse_of 选项还有什么作用?任何类型的缓存...?得到了答案,是optimization
  • 这里为什么不用提foreign_key
  • 做同一件事的多种方式...我们不需要在这里明确地指定它,因为我们已经在使用inverse_of。如果我们改用foreign_key,我们必须将following 更改为following_ids。我认为inverse_of 方法看起来更干净。
  • RoR Associations Guide 有更多关于这方面的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
相关资源
最近更新 更多