6

Я хочу сделать полиморфные ассоциации с paperclip и разрешить моему пользователю иметь один аватар и несколько изображений.rails 3 полиморфная ассоциация с скрепкой и несколькими моделями

Attachment модель:

class Attachment < ActiveRecord::Base 
belongs_to :attachable, :polymorphic => true 
end 

class Avatar < Attachment 
has_attached_file :image, :styles => { :thumb => "150x150>", :view => "260x180>" }, 
end 

class Image < Attachment 
has_attached_file :image, :styles => { :thumb => "150x150>", :view => "260x180>" }, 
end 

Модель пользователя:

has_one :avatar, :as => :attachable, :class_name => 'Attachment', :conditions => {:type => 'avatar'} 
accepts_nested_attributes_for :avatar 

пользователя контроллера:

def edit 
    @user.build_avatar 
end 

пользователя Просмотр формы:

<%= form_for @user, :html => { :multipart => true } do |f| %> 

    <%= f.fields_for :avatar do |asset| %> 
     <% if asset.object.new_record? %> 
      <%= asset.file_field :image %> 
     <% end %> 
    <% end %> 

при попытке сохранить изменения, которые я получаю ошибку => неизвестный атрибут: аватар

если я удалю: class_name => «вложение» в HAS_ONE ассоциации я получаю ошибку => неинициализированный постоянный пользователь :: Аватар

Мне нужно также приложить аватары для сообщения в блоге, так что мне нужна связь, чтобы быть полиморфными (или по крайней мере я так думаю)

Я в тупик, и любая помощь будет принята с благодарностью.

ответ

6

У меня есть проект в работах, который успешно использует скрепки и полиморфные ассоциации. Позвольте мне показать вам, что у меня есть, и, возможно, вы можете применить его к проекту:

class Song < ActiveRecord::Base 
    ... 
    has_one :artwork, :as => :artable, :dependent => :destroy 
    accepts_nested_attributes_for :artwork 
    ... 
end 

class Album < ActiveRecord::Base 
    ... 
    has_one :artwork, :as => :artable, :dependent => :destroy 
    accepts_nested_attributes_for :artwork 
    ... 
end 

class Artwork < ActiveRecord::Base 
    belongs_to :artable, :polymorphic => true 
    attr_accessible :artwork_content_type, :artwork_file_name, :artwork_file_size, :artwork 

    # Paperclip 
    has_attached_file :artwork, 
    :styles => { 
     :small => "100", 
     :full => "400" 
    } 

    validates_attachment_content_type :artwork, :content_type => 'image/jpeg' 
end 

форма песни и альбомы форме, включают это как частичный:

<div class="field"> 
<%= f.fields_for :artwork do |artwork_fields| %> 
    <%= artwork_fields.label :artwork %><br /> 
    <%= artwork_fields.file_field :artwork %> 
<% end %> 

дон «т забудьте включить: HTML => {: многочастному => верно} с формой

artworks_controller.rb

class ArtworksController < ApplicationController 
    def create 
    @artwork = Artwork.new(params[:artwork]) 

    if @artwork.save 
     redirect_to @artwork.artable, notice: 'Artwork was successfully created.' 
    else 
     redirect_to @artwork.artable, notice: 'An error ocurred.' 
    end 
    end 
end 

и, наконец, выдержка из song_controller.гь:

def new 
    @song = Song.new 
    @song.build_artwork 
end 
+0

ahh только то, что мне нужно, спасибо Бретт! – kaigth

+0

@kaigth, извините, я дал вам такой обход. Я должен был только начать с этого. С наилучшими пожеланиями. – Brett

+0

Могут ли стили для вложений в Artwork быть разными для альбома и песни на основе полиморфных отношений? – ramkumar

0

Я не уверен, что вам действительно нужно быть полиморфным. Как насчет этого подхода, который использует has_many: через? На простом английском языке пользователь имеет один аватар, который имеет несколько изображений, и через эту связь вы можете вызвать User.images, чтобы получить коллекцию изображений, связанных с аватаром.

http://guides.rubyonrails.org/association_basics.html

class User < ActiveRecord::Base 
    has_one :avatar 
    has_many :images, :through => :avatar 
end 

class Avatar < ActiveRecord::Base 
    belongs_to :user 
    has_many :images 
end 

class Image < ActiveRecord::Base 
    belongs_to :avatar 
    has_attached_file :image, :styles => { :thumb => "150x150>", :view => "260x180>" }, 
end 

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

class User < ActiveRecord::Base 
    has_many :avatars 
end 

, который предоставит вам столько изображений (аватаров), сколько вы хотите.

+0

то будет удивительным, но я также хочу, чтобы прикрепить аватары сообщения в блоге, так что я по-прежнему нужно будет использовать полиморфные ассоциации Post :: Аватар – kaigth

+0

@kaigth бы вы не хотите, чтобы прикрепить пользователям сообщения в блоге, и затем захватить связанный с ними аватар? – Brett

+0

@ Brett Я хочу, чтобы люди могли назначать отдельные аватары для сообщений в блоге, поэтому их сообщения могут быть уникальными, а не аватарами пользователей. – kaigth

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