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.