RoR Как сделать более одной сборки Build в одном блоке без потери информации? - PullRequest
0 голосов
/ 13 июня 2011

Я только начинаю небольшой проект, чтобы узнать больше о новых возможностях в 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 Ответ

2 голосов
/ 13 июня 2011

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

  • @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
...