2

我对 Rails 还很陌生,我得到了这段代码,但我认为我正在阻止它做它的一些 Rails 魔法:

目标:创建一个并让创建者通过表中的方法和关联cause成为成员。buildhas_many :throughCause_User_Membership

问题:我已经通过创建一个cause然后“手动”创建一个成员资格来实现它。有没有办法在Cause_User_Membership创建时自动创建关系cause

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

用户.rb(片段)

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

原因.rb

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

Cause_User_Membership.rb(<--可能不是我最好的模型名称)

    # == 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
4

1 回答 1

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
      ...

因为您已经告诉 rails 接受causeon 关联的嵌套属性,所以它会在保存成员资格本身时保存CauseUserMembership您分配给的新原因。@membership.cause因此,您可以一次保存原因和成员记录,而不是单独保存。

原答案:

我认为您所做的几乎是正确的方法。它可以简化一点:您不需要从 构建causecurrent_user您只需使用new(创建时设置和设置的:through关联)。causecurrent_user@membership

所以像这样(我只改变了第一行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
      ...

另请参阅:通过关联在 Rails 应用程序中构建/创建属性的多对多

于 2012-11-29T00:09:09.410 回答