2010-08-19 4 views

Odpowiedz

10

Tak. Używam dziedziczenia pojedynczych tabel (STI) w witrynach do obsługi dźwięku, wideo i obrazów za pośrednictwem modelu zasobów.

# models/Asset.rb 
class Asset < ActiveRecord::Base 
    # Asset has to exist as a model in order to provide inheritance 
    # It can't just be a table in the db like in HABTM. 
end 

# models/Audio.rb 
class Audio < Asset # !note inheritance from Asset rather than AR! 
    # I only ever need the original file 
    has_attached_file :file 
end 

# models/Video.rb 
class Video < Asset 
    has_attached_file :file, 
    :styles => { 
     :thumbnail => '180x180', 
     :ipod => ['320x480', :mp4] 
     }, 
    :processors => "video_thumbnail" 
end 

# models/Image.rb 
class Image < Asset 
    has_attached_file :file, 
    :styles => { 
     :medium => "300x300>", 
     :small => "150x150>", 
     :thumb => "40x40>", 
     :bigthumb => "60x60>" 
    } 
end 

Wszystkie one wchodzą w Rails jak :file, ale kontroler (A/V/I) wie, aby zapisać się do właściwego modelu. Pamiętaj tylko, że wszystkie atrybuty dowolnej formy mediów muszą być zawarte w Asset: jeśli wideo nie wymaga napisów, ale obrazy, to atrybut podpisu będzie zerowy dla Video. Nie będzie narzekać.

Stowarzyszenia będą również działać poprawnie, jeśli zostaną podłączone do modeli STI. User has_many :videos będzie działać tak samo, jak używasz go teraz, tylko upewnij się, że nie próbujesz zapisywać bezpośrednio w Zasobie.

# controllers/images_controller.rb 
    def create 
    # params[:image][:file] ~= Image has_attached_file :file 
    @upload = current_user.images.build(params[:image]) 
    # ... 
    end 

Wreszcie, ponieważ masz model aktywów, możesz odczytywać go bezpośrednio, np. chcesz listę 20 najnowszych aktywów. Ten przykład nie ogranicza się do oddzielania typów mediów, można go również używać do różnych rodzajów tego samego: Avatar, Subskrypcja < Zasób, Galeria < Zasób i tak dalej.

+2

Gdzie można określić, gdzie plik zostanie zapisany? W modelu aktywów? A może model zasobów jest pusty? powiedz: ': storage =>: s3, : bucket => Rails.application.config.aws_s3_bucket, : s3_credentials =>" # {Rails.root} /config/s3.yml ", : ścieżka =>": class /: id /: style /: basename.: extension "' –

+0

Po prostu używam wartości domyślnej i utrzymuję model aktywów pusty, ale założę się, że istnieje sposób na domyślny zestaw w modelu aktywów. Nie próbowałem. – Eric

2

Znacznie nicer sposób może być, (jeżeli zastosowanie do czynienia z obrazami):

class Image < ActiveRecord::Base 
    belongs_to :imageable, :polymorphic => true 
    has_attached_file :attachment, styles: lambda { 
    |attachment| { 
     thumb: ( 
     attachment.instance.imageable_type.eql?("Product") ? ["300>", 'jpg'] : ["200>", 'jpg'] 
    ), 
     medium: ( 
     ["500>", 'jpg'] 
    ) 
    } 
    } 
end 
+0

Czy Twoja odpowiedź naprawdę działa? attachment.instance.imageable_type is nil –

+0

@ArtemAminov Tak to działa ... ponieważ używam go w jednym z moich projektów. –

+0

może możesz mi pomóc z moim projektem, zobacz kod tutaj [link] (http://stackoverflow.com/questions/19901485/paperclip-polymorphic-styles) –