ruby-on-rails-3 - 轨道 3 : Has_many through and Me

标签 ruby-on-rails-3 activerecord associations has-many-through

我对 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 接受 CauseUserMembershipcause 关联的嵌套属性,所以它将保存您分配给 @membership.cause< 的新原因 当它保存成员资格本身时。因此,您可以同时保存事业记录和成员(member)记录,而不是单独保存。

原始答案:

我认为您所做的几乎是正确的方法。它可以简化一点:您不需要从 current_user 构建 cause,您只需使用 new ( :throughcausecurrent_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/

相关文章:

ruby-on-rails-3 - 使用 Rails 保存 Backbone.js 模型时出错

ruby-on-rails - 使用回调和 STI 的 ActiveRecord 问题

ruby-on-rails - 在 `find_or_create_by` `has_many` 关联上使用 `through` 时出错

ruby-on-rails - 了解 Rails 指南关联示例

ruby-on-rails - Rails查询联接关联表的别名

ruby-on-rails - Rails 中至少有 2 个 DateTime?

ruby-on-rails - Rails 复选框和参数

ruby-on-rails-3 - 导轨 : Make different references to a DB row refer to the same Ruby object

ruby-on-rails - Ruby/Rails-我可以将联接表的作用域(或类方法)用作WHERE子句的一部分吗?

ruby-on-rails-3 - rails 3 - FactoryGirl 创建关联记录