RoR Как сделать более одной сборки Build в одном блоке без потери информации?

Сейчас я только начинаю небольшой проект, чтобы узнать больше о новых возможностях в RoR 3 . Поэтому я читал об ассоциациях между объектами, более конкретно о методе "сборки". Моя проблема, когда я использую его один раз, нет проблем, как:

@note = product.notes.build(:product => product)

а затем я изменяю некоторые атрибуты заметки и никаких проблем.

Проблема в примечании belongs_to два объекта Product а также User поэтому, когда я создаю объект, мне нужно создать эту ассоциацию, поэтому мне нужно сделать что-то вроде

@note = product.notes.build(:product => product)
@note = user.notes.build(:user => user)

После второй сборки я потерял связь с Product, потому что метод "build" вернет новый экземпляр.

Я что-то упускаю из-за того, как я должен строить ассоциации? Должен ли я сделать это по-другому?

Спасибо!

# POST /notes
# POST /notes.xml
def create
  user = current_user
  product = Product.find(2)
  @note = product.notes.build(:product => product)
  @note = user.notes.build(:user => user)

  @note.rating = params[:note][:rating]
  @note.text = params[:note][:text]
  respond_to do |format|
    if @note.save
      format.html { redirect_to(@note, :notice => 'Note was successfully created.') }
      format.xml  { render :xml => @note, :status => :created, :location => @note }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @note.errors, :status => :unprocessable_entity }
    end
  end
end

Здесь идет определение продукта

class Product < ActiveRecord::Base
  validates :name,  :presence => true
  has_many :notes ,:dependent => :destroy
end

и Примечание

class Note < ActiveRecord::Base
  belongs_to :product
  belongs_to :user
end

1 ответ

Решение

Выберите способ, который вы предпочитаете:

  • @note = Note.new(:user => user, :product => product)
  • @note = product.notes.build(:user => user)
  • @note = user.notes.build(:product => product)

Если вы напишите два @note =Вы переназначаете другой объект на @note и первый потерян.

Вы также можете написать что-то вроде этого:

@note = product.notes.build
@note.user = user
Другие вопросы по тегам