Rails 3: Has_many и Me

Я довольно новичок в Rails, у меня работает этот код, но я думаю, что мешаю ему делать это из-за его магии Rails:

Цель: создать cause и создатель стал участником через build метод и has_many :through ассоциация в Cause_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

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 (<- вероятно, не лучшее название моей модели)

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

1 ответ

Решение

Обновить:

Я нашел немного более "волшебный" способ сделать это, используя 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
      ...

Потому что вы сказали рельсам принимать вложенные атрибуты для cause ассоциация по CauseUserMembership, это сохранит новую причину, которую вы назначили @membership.cause когда это спасет само членство. Таким образом, вы можете сохранять как причину, так и записи о членстве одновременно, а не по отдельности.

Оригинальный ответ:

Я думаю, что вы сделали, это в значительной степени правильный способ сделать это. Это может быть немного упрощено: вам не нужно строить cause от current_user Вы можете просто использовать 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
      ...

См. Также: " Многие ко многим через ассоциацию". Создание / создание свойств в приложении Rails.

Другие вопросы по тегам