【问题标题】:How to delete all associations between object and group of objects?如何删除对象和对象组之间的所有关联?
【发布时间】:2016-01-12 10:31:54
【问题描述】:

我有:

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

当用户点击“删除组”时,应用删除组和用户之间的关联,如果没有其他人使用该组,则销毁它:

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

【问题讨论】:

    标签: ruby-on-rails associations


    【解决方案1】:

    如果您想删除群组中特定用户的所有帖子,您可以这样做

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

    这也可以像这样作为方法添加到 post 模型中

    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

    【讨论】:

    • group.posts.where(user_id: current_user.id).destroy_all 如果我在帖子表中有 user_id 列,它将起作用,但我有 HABTM 关联,​​所以情况有所不同。
    • 好的,如果您将user_id 更改为group_id,因为这是一对多关联。所以你会运行类似current_user.posts.where(group_id: group.id).destroy_all
    • 是的,它可以工作,但会破坏相关的帖子。而且我只需要破坏帖子和用户之间的关联。我做了一个变体,它有效,但我一点也不喜欢它。我会更新我的问题。
    猜你喜欢
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多