1

第一個問題:我有一個組模型belongs_to :creator, :class_name => "User",如果創建者離開,我希望組中的其他用戶成爲「創建者」。我將如何做到這一點?羣組創建者轉移到其他用戶如果羣組創建者離開組

作爲第二個問題,我還想讓離開的創作者在離開時選擇新的創作者,或者讓它自動分配。

截至目前這些都是我的模型是這樣的:

class Group < ActiveRecord::Base 

    belongs_to :creator, :class_name => "User" 

    has_many :members, :through => :memberships 
    has_many :memberships, :foreign_key => "new_group_id" 

和我的用戶模型:

class User < ActiveRecord::Base 

    has_many :groups, foreign_key: :creator_id 

    has_many :memberships, foreign_key: :member_id 
    has_many :new_groups, through: :memberships 

作爲第三個問題,我想被破壞組創作者離開時。我怎樣才能建立這種關係?

回答

2

這些是3個問題,前兩個是相當開放的,所以我會試着回答他們所有的問題,以便做出一些假設。

第一個問題

這取決於你想要選擇一個新創作者是行爲什麼。你想從目前的members自動分配嗎?您是否想讓其他會員自行將其自動分配爲創建者?在後者中,您需要爲您的成員提供完整的UI(路由,控制器,視圖),因此我將向您展示如何編寫第一個選項。

首先,我封裝組離開邏輯到它自己的方法對Group模型,我們將在控制器用於此目的。在Group上,我們定義了指定爲新的creator的邏輯。這裏的邏輯將會通過方法new_creator如果我們有,或者默認爲members的第一個,如果沒有給出。

class Group < ActiveRecord::Base 
    def reassign(new_creator = nil) 
    new_creator ||= members.first 

    if new_creator 
     self.creator = new_creator 
     save 
    else 
     false 
    end 
    end 
end 

作爲一個替代方法,可以移動這樣的邏輯到Observer(或any alternative),將上Group模型觀察爲屬性creator_id被清零。

第二個問題

這其中將包括一個完整的UI,你需要根據自己的標準,從而找出自己。總之,我想創建一個在您GroupsController新動作爲members離開羣體是這樣的:

# config/routes.rb 
resources :groups do 
    member do 
    get :leave 
    patch :reassign 
    end 
end 

# app/controllers/groups_controller.rb 
class GroupsController < ApplicationController 
    def leave 
    @group = Group.find(params[:id]) 
    end 

    def reassign 
    @group = Group.find(params[:id]) 
    if @group.reassign(params[:new_creator_id]) 
     redirect_to my_fancy_path 
    else 
     render :leave 
    end 
    end 
end 

在你的意見你有你form_for @group與新成員的候選人(可能有select_tag :new_creator_id)和根據您的喜好選擇其餘的用戶界面。

第三個問題

這是最簡單的。您只需定義像這樣的關聯,您將在用戶被刪除後將所有User組銷燬。

class User < ActiveRecord::Base 
    has_many :groups, foreign_key: :creator_id, dependent: :destroy 
end 
+1

你完美地回答了我的問題。非常清楚和容易理解。謝謝 – 2015-02-27 23:57:24

+0

很高興知道!只要讓我知道你是否可以將代碼放入你的應用。不要忘記upvote/accept等! ;) – dgilperez 2015-02-27 23:59:29