2

我是相當新的Rails的,我得到這個代碼工作,但我想我阻止它做它的一些Rails的魔力:的Rails 3:HAS_MANY通過和Me

目標:創建cause,並讓創建者通過Cause_User_Membership表中的build方法和has_many :through關聯成爲成員。

問題:通過創建一個cause,然後手動創建成員資格,我已經完成了它的工作。在創建cause時,是否可以自動創建Cause_User_Membership關係?

Cause_Controller.rb

def create 
@cause = current_user.causes.build(params[:cause].merge :created_by => current_user.id) 

respond_to do |format| 
    if @cause.save 
    @membership = current_user.cause_user_memberships.build(:cause_id => @cause.id) 
    @membership.save 
    format.json { render :json => {current_user: current_user, results: @cause}} 
    else 
    format.json { render :json => {Message: "You messed up"}} 
    end 
end 
end 

User.rb(片斷)

has_many :cause_user_memberships 
has_many :causes, :through => :cause_user_memberships 

Cause.rb

attr_accessible :title, :location, :description,... 
has_many :cause_user_memberships 
has_many :users, :through => :cause_user_memberships 

Cause_User_Membership.rb(< --probably不是我最好的型號名稱)

# == Schema Information 
# 
# Table name: cause_user_memberships 
# 
# id   :integer   not null, primary key 
# user_id :integer   not null 
# cause_id :integer   not null 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# 

class CauseUserMembership < ActiveRecord::Base 
    attr_accessible :cause_id, :user_id 

    belongs_to :user #, :class_name => "User", :foreign_key => "user_id" 
    belongs_to :cause #, :class_name => "Cause", :foreign_key => "cause_id" 

end 
+0

如果你只是刪除你設置'@ membership'兩行?我認爲應該在關聯上使用'build'時自動創建記錄。 –

+0

它並沒有創造它,這就是我的頭撞牆的感謝:)謝謝你回到我身邊! –

+0

哦,你是對的:https://rails.lighthouseapp.com/projects/8994/tickets/3600-has_many-through-associationbuild-doesnt-create-the-through-models https://rails.lighthouseapp.com/projects/8994/tickets/220-habtm-collection-build-doesn -t-build-join-associations-different-collection-create –

回答

2

更新:

我發現了一個略微更 「神奇」 的方式來做到這一點使用accepts_nested_attributes_for。首先,添加一行到您的CauseUserMembership型號:

class CauseUserMembership < ActiveRecord::Base 
    attr_accessible :cause_id, :user_id 

    belongs_to :user 
    belongs_to :cause 

    accepts_nested_attributes_for :cause 

隨着這種變化,你可以這樣做:

def create 
    @membership = current_user.memberships.build 
    @membership.cause = Cause.new(params[:cause].merge(:created_by => current_user.id) 

    respond_to do |format| 
    if @membership.save 
     ... 

因爲你已經告訴導軌接受CauseUserMembershipcause關聯嵌套的屬性,它當它保存會員本身時,將保存您分配給@membership.cause的新原因。因此,您可以一次保存原因和會員記錄,而不是單獨保存。

原來的答覆:

我認爲你做了什麼幾乎是做到這一點的正確方法。它可以簡化一點點:你不需要從current_user建立cause,你可以只使用new(當你創建@membership時和current_user:through關聯)。

所以像這樣(我只是改變了create第一行):

def create 
    @cause = Cause.new(params[:cause].merge(:created_by => current_user.id)) 

    respond_to do |format| 
    if @cause.save 
     @membership = current_user.cause_user_memberships.build(:cause_id => @cause.id) 
     @membership.save 
     ... 

參見:Many-to-Many through association Build/Create properties in Rails app

+0

太好了,謝謝!爲什麼這不是'奇蹟般地'完成的,有沒有特別的理由? –

+0

我已經用稍微更「神奇」的方式更新了我的答案。看看你的想法。 –

+0

謝謝,新方法也奏效。我試着做幾乎相同的,因爲接受會員的屬性,但無法讓它工作。你列出的兩種方法中,哪一種會被認爲是更好的做法? –