如何删除对象和对象组之间的所有关联?

时间:2016-01-12 10:31:55

标签: ruby-on-rails associations

我有:

user.rb
  has_and_belongs_to_many :groups
  has_and_belongs_to_many :posts
group.rb
  has_and_belongs_to_many :users
  has_many :posts, dependent: :destroy
post.rb
  belongs_to :group
  has_and_belongs_to_many :users

当用户点击"删除组" app删除Group和User之间的关联,如果没有其他人使用此组,则销毁它:

def destroy
  @group = Group.find(params[:id])
  remove_group_from_user(@group)
  if @group.users(true).empty? 
    @group.destroy
  end
end

def remove_group_from_user(group)
  user = current_user.id
  if user
    group.users.delete(user)
  end
end

但是用户已在此组中关联帖子。当删除组 - 用户关联时,我需要删除用户和组的帖子之间的所有关联。

类似的东西:

group.posts.users.delete(current_user.id)

怎么做?

更新 这是有效的,但我根本不喜欢它。如何使它漂亮?

def remove_group_from_user(group)
    user = current_user.id
    if user
      group.users.delete(user)
      current_user.posts.where(group_id: group.id).
                   each do |post| #from here
        post.users.delete(user)
        if post.users(true).empty?
          post.destroy
        end
      end
    end
  end

1 个答案:

答案 0 :(得分:0)

如果您要删除组中特定用户的所有帖子,可以执行

group.posts.where(user_id: current_user.id).destroy_all

这也可以作为一种方法添加到帖子模型中,如此

def self.by_user(user)
    where(user_id: user.id)
end

然后你可以通过调用

来完成同样的事情
group.posts.by_user(current_user).destroy_all

但我建议将其放在每个模型中的回调中,以保持清洁。您可以在此处了解有关回调的更多信息http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html