我对 Rails 还很陌生,我让这段代码正常工作,但我认为我阻止了它发挥 Rails 的一些魔力:
目标:创建一个原因
并让创建者通过build
方法和has_many :through
成为成员Cause_User_Membership
表中的 code> 关联。
问题:通过创建事业
,然后“手动”创建成员(member)资格,我已经让它发挥作用了。有没有办法在创建原因
时自动创建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
原因.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
最佳答案
更新:
我发现了一种稍微“神奇”的方法来做到这一点,使用 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 接受 CauseUserMembership
上 cause
关联的嵌套属性,所以它将保存您分配给 @membership.cause< 的新原因
当它保存成员资格本身时。因此,您可以同时保存事业记录和成员(member)记录,而不是单独保存。
原始答案:
我认为您所做的几乎是正确的方法。它可以简化一点:您不需要从 current_user
构建 cause
,您只需使用 new
( :through
与 cause
和 current_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
...
另请参阅:Many-to-Many through association Build/Create properties in Rails app
关于ruby-on-rails-3 - 轨道 3 : Has_many through and Me,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13595883/