Вы можете использовать @thread.attachments.build
для создания нового несохраненного вложения.
Если у вас :autosave => true
на вашем has_many
(явно или через accepts_nested_attributes_for
), они будут сохранены при сохранении родительского потока.
Для правильной работы новых записей может потребоваться установить :inverse_of
для ассоциаций для сохранения:
class Thread < ActiveRecord::Base
has_many :attachments, :inverse_of => :thread, :autosave => true
end
class Attachment < ActiveRecord::Base
belongs_to :thread, :inverse_of => :attachments
end
Как упоминалось @zetetic: Thread
- это встроенный класс Ruby, и вы не должны использовать то же имя, что и системный класс в своем приложении.
Существует ряд классов на любом языке, которые вы учите не использовать. В таких случаях я бы добавил что-то к своему имени класса, чтобы сделать его более наглядным, предполагая, что нет лучшего имени в целом. Взяв удар в том, что вы приложение, вы должны переименовать это с Thread
на что-то вроде Message
или MessageThread
.
Что происходит, так как Thread
является базовым классом, который загружается перед кодом вашего приложения. В памяти уже есть класс Thread
, и Rails не ищет его в режиме разработки при первом обращении к нему. Rails загружает ваши классы по требованию в процессе разработки путем поиска файла thread.rb
, когда на ссылку Thread
ссылаются, и в данный момент она не загружена.
В рабочем режиме Rails загружает все классы при запуске, и отличающийся базовый класс (Object
против ActiveRecord::Base
) приведет к TypeError
.