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

谢谢,新方法也奏效。我试着做几乎相同的,因为接受会员的属性,但无法让它工作。你列出的两种方法中,哪一种会被认为是更好的做法? –