Вложенные атрибуты
В Rails есть встроенный механизм, который называется accepts_nested_attributes
.Что позволяет создавать вложенные записи в одном запросе:
class Item
has_many :images
accepts_nested_attributes_for :images
end
class Image
belongs_to :item
has_one_attached :file
end
Это позволит вам создать элемент и изображения с помощью:
Item.create(name: 'Foo', image_attributes: [{ file: 'foo.jpg'}, { file: 'bar.jpg'}])
ActiveRecord будет обрабатывать вставку записей в правильном порядке..
Это позволяет вам иметь необнуляемый внешний ключ (item_id
) и избегать потерянных записей, что является очень реальной проблемой для вашего решения. Ссылочная целостность должно быть довольно высоко в вашем списке приоритетов.
Используется в модели вместе с fields_for
в представлении (форме).
<%= form_with(model: @item) do |form| %>
<%= form.fields_for(:images) do |image_fields| %>
<%= image_fields.file_field :file %>
<% end %>
<% end %>
И передавая массив ключей в строгих параметрах:
params.require(:item).permit(:name, image_attributes: [:file])
ActiveStorage has_many_attached
ActiveStorage также позволяет вам установить связь один ко многим безмодель с помощью has_many_attached
.Вложения хранятся в таблице active_storage_attachments
.Однако, насколько я знаю, нет способа прикрепить дополнительные метаданные (например, порядок) к вложениям.