2017-02-21 104 views
0

Я просто изучаю рельсы, я изо всех сил пытаюсь разработать лучший способ структурирования своего приложения.Rails beginner architecture - более одной модели с загрузкой файла

У меня есть две модели

Jobs 
Posts 

Это отдельные части приложения, но каждый из них может иметь много файлов, загруженных с каждой записью

мне было интересно, что лучший способ структурировать это, мне .. .

1 - Храните все файлы в одну таблице .. Создание загрузок модели затем связать каждый тип через has_many: через (или полиморфную ассоциация)

2 - Используйте отдельные таблицы - Создание JobUploads и PostUploads модели (я не предусматривают обмен файлами между проблемами)

Я думаю, либо будет работать, моя основная путаница является контроллеры/маршруты

ли я создать новый UploadsController или JobUploadsController & PostUploadsController в зависимости от метода я выбрал или вы бы добавить новые действия существующих сообщений и Контроллер рабочих мест?

Я предполагаю, что идеальным маршрутом для загрузки изображения задания будет /jobs /: job_id/files/new, это правильный способ сделать это?

Если я создаю новые контроллеры, я бы закончил с /job_files/new, тогда я предполагаю, что мне придется каким-то образом передать объект задания.

К сожалению, если его немного очевидным для некоторых

Большое спасибо!

(пс с использованием рельсов 5)

ответ

0

Ваш лучший снимок создает полиморфную ассоциацию или ваш упомянутый UploadsController. Допустим, вы загружаете изображения.

class UploadedImage < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 
end 

class Job < ActiveRecord::Base 
    has_many :images, as: : imageable 
end 

class Post < ActiveRecord::Base 
    has_many :images, as: : imageable 
end 

Не забудьте определить в вашем routes.rb

concerns :imageable do 
    resources :uploaded_images, shallow: true 
end 

resources :posts, concerns: [:imageable] 
resources :jobs, concerns: [:imageable] 

Это создает маршруты любит ->/сообщений /: POST_ID/изображений,/работы /: job_id/изображения

Тогда вам просто необходимо чтобы получить тип внутри вашего UploadedImagesController. Там вы можете загрузить образный тип и прикрепить к нему изображение. Пример контроллер будет выглядеть

class UploadedImagesController < ApplicationController 

    prepend_before_filter :load_imageable, only: :create 

    def create 
     @image = @imageable.images.create(image_params) 
     render json: @image.as_json 
    end 

    def update 
     @image = UploadedImage.find(params[:id]) 
     @image.update(image_params) 
     render json: @image.as_json 
    end 

    def destroy 
     @image = UploadedImage.find(params[:id]) 
     @image.destroy! 
     render json: @image.as_json 
    end 

    private 

    def load_imageable 
     params.keys.select { |k| k =~ /([a-z_]*)_id/ }.first 
     @imageable = $1.camelcase.constantize.find(params["#{$1}_id"]) 
    end 

    def image_params 
     params.require(:image).permit(:file, :caption) 
    end 
end 

Используя полиморфные ассоциации принесет много преимуществ и позволяет много повторного использования кода, как вы понимаете, что многие нынешние и будущие модели вашей системы будут выступать в качестве гарантируемого.

0

Я думаю, что лучшая идея здесь, чтобы решить, на драгоценный камень для загрузки файла. Наиболее популярными являются paperclip gem или драгоценный камень-носитель. Затем, согласно их документации, вы можете выполнить загрузку.

//github.com/carrierwaveuploader/carrierwave

//github.com/thoughtbot/paperclip

При использовании carrierwave, например, вам не нужно, чтобы создать контроллер. Вы можете создать загрузчик и смонтировать его в своей модели ...

Самоцветы - это самый простой способ загрузки файлов в рельсы. Вам не нужно создавать контроллер загрузки. Вы можете добавить столбец к своим сообщениям, заданиям и позволить десктопу обрабатывать загрузку. Подробную информацию можно найти по ссылкам выше

+0

Спасибо за ваш ответ! Фактическая механика загрузки я в порядке с (я думаю) посмотрел на несущую волну, но также проверит скрепку. Это был скорее гипотетический вопрос о структуре всего этого. Еще раз спасибо. – JWilks

+0

carrierwave выглядит так, будто хочет хранить несколько загрузок в одном поле в модели – JWilks

+0

Да. правильно. Он хранится в массиве. –

 Смежные вопросы

  • Нет связанных вопросов^_^