2012-02-20 62 views
0

非常簡單的設置。我想確保我對ORM的理解是正確的。簡單的has_many:通過關聯

class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, through => memberships 
end 

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, through => memberships 
end 

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

現在,當用戶創建一個組時,我希望鏈接表中的成員記錄得到填充。它應該是一個原子(交易)。

class GroupsController < ApplicationController 
    def create 

    @group = current_user.groups.build(params[:group]) 

    if @group.save 
     flash[:notice] = "Group has been created." 
     redirect_to @group 
    else 
     flash[:alert] = "Group has not been created." 
     render :action => "new" 
    end 
    end 
end 

這不起作用。該組被保存,但沒有在鏈接表中創建成員記錄。然而使用創建vs構建工程。這是它應該如何工作?

這裏最好的辦法是什麼?

+0

你在@ group.save行中有一個錯字,(if在開始時不應該有@) – bruno077 2012-02-20 02:19:59

+0

是的,這只是一個粘貼它的錯誤。問題依然存在。 – 2012-02-20 02:25:11

+0

你能粘貼你的視圖的代碼嗎? – bruno077 2012-02-20 02:31:05

回答

0

此行爲是設計使然。正如你所提到的,你可以做@group = current_user.groups.create(params[:group])

或者你可以添加一個額外的語句來創建的連接模型的表中的記錄爲:

@group = current_user.groups.build(params[:group]) 
if @group.save 
    @group.memberships.create(:user_id => current_user) 
    # redirect and notify 

好,原因是簡單地建立@group並保存它不連接表中增加一個額外的記錄。

事實上,在這種情況下,@group = current_user.groups.build(params[:group])有點類似於@group = Group.new(params[:group])。不同之處在於,在前一種情況下,current_user.groups將包含@group(您可以在重定向之前嘗試在Groups#create之前),但在做current_user.reload後跟current_user.groups將產生[]

做到這一點的最好方法有點類似於你的方法。有一個簡單的創建行動:

def create 
    @group = Group.new(params[:group]) 
    # if else for save and redirect 

然而,這個工作提交Groups#create params哈希表應包括user_ids爲:

"group"=>{"name"=>"new group", "user_ids"=>["1", "2", "3"]}, "commit"=>"Create Group" 

可能這就是爲什麼@ bruno077是問你的理由粘貼你的視圖的代碼,以獲得關於傳遞的user_ids參數的想法。因此,如果新的組表單包含選擇多個用戶的字段,那麼其簡單的創建操作就像上面所示(因爲user_ids參數)。但是如果有一個沒有選擇用戶選項的新組表單,那麼最好使用第一個選項(一個使用create)。

+0

只有傳遞參數是group [name]&group [description]。問題的癥結在於,如果社團在建立和創造方面存在固有的不對稱性, if @ group.save; #創建成員資格; 是,它不是原子的,如果成員資格失敗,你離開孤立組。 – 2012-02-20 07:31:14

+0

即使有多個用戶的表單,因爲關聯從來不會被使用,所以用Group.new創建也不會有任何幫助。它永遠不會像上面那樣簡單的創建操作。 – 2012-02-20 07:53:10

+0

是的,創建組然後創建成員資格的問題是原子性,因爲它們是兩個完全不同的事務。但是,我認爲使用create,即'current_user.groups.create(params [:group])'作爲一個單獨的事務不應該有這樣的問題。如果連接模型驗證導致無法在連接表中創建記錄,則事務將回滾。所以,不應該有一個與會員關係不密切的團體。 – prasvin 2012-02-20 07:59:45