gpt4 book ai didi

ruby-on-rails - HABTM mongoid 追随者/追随者

转载 作者:行者123 更新时间:2023-12-03 16:07:15 26 4
gpt4 key购买 nike

Mongoid 在 habtm 上带有 .push,它在两个方向上设置了 habtm 关系。尽管删除会#delete 关联记录,但没有记录的方法可以仅删除我所见过的关系。有没有更好的方法来做到这一点?

有没有更好的方法来确保唯一性?

has_and_belongs_to_many :following, {class_name: 'User', inverse_of: :followers, inverse_class_name: 'User'}
has_and_belongs_to_many :followers, {class_name: 'User', inverse_of: :following, inverse_class_name: 'User'}

def follow!(user)
self.following.push(user) # this pushes the inverse as well
self.following_ids.uniq!
self.save!
user.follower_ids.uniq!
user.save!
end

def unfollow!(user)
self.following.delete(user.id)
self.save!
user.followers.delete(self.id)
user.save!
end

最佳答案

以下代码对我来说很好(mongoid 2.3.x):

class User
include Mongoid::Document

field :name, type: String

has_and_belongs_to_many :following, class_name: 'User', inverse_of: :followers, autosave: true
has_and_belongs_to_many :followers, class_name: 'User', inverse_of: :following

def follow!(user)
if self.id != user.id && !self.following.include?(user)
self.following << user
end
end

def unfollow!(user)
self.following.delete(user)
end
end

inverse_class_name ,没有保存调用,没有特殊处理,但排除自我跟随。

原因是,那个 mongoid 会自动使用 dependent: nullify如果没有添加到关系语句中。并与 autosave: true关系的更新被保存(并且只需要关注,因为我们不直接改变关注者)。如果没有自动保存选项,您需要在方法中添加保存调用,因为 mongoid 不会自动保存关系更新(自 2.0.0.x 起)。

我把 if 子句作为块,所以你可以用异常处理( else raise FooException )来改变它。
.delete(user)没关系,在 mongoid 文档中也提到: http://mongoid.org/docs/relations/referenced/n-n.html (向下滚动到“依赖行为”)。

关于ruby-on-rails - HABTM mongoid 追随者/追随者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8580822/

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