6

Ich möchte polymorphe Assoziationen mit Büroklammer machen, und erlauben Sie meinem Benutzer, einen Avatar und mehrere Bilder zu haben.Schienen 3 polymorphe Assoziation mit Büroklammer und mehrere Modelle

Befestigung Modell:

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 

Benutzermodell:

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

Benutzer Controller:

def edit 
    @user.build_avatar 
end 

Benutzeransicht Form:

<%= 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 %> 

wenn ich versuche, um die Änderungen zu speichern ich den Fehler => unbekannt Attribut: Avatar

wenn ich entfernen: class_name => ‚Bindung‘ in der has_one Vereinigung ich den Fehler => nicht initialisierte Konstante Benutzer erhalten :: Avatar

ich muss auch Avatare anhängen Beiträge bloggen, also muss ich den Verein polymorph sein (oder zumindest denke ich so)

ich bin ratlos und jede mögliche Hilfe würde sehr geschätzt werden.

Antwort

6

Ich habe ein Projekt in den Arbeiten, das erfolgreich Paperclip und polymorphe Assoziationen verwendet. Lassen Sie mich Ihnen zeigen, was ich habe, und vielleicht können Sie es zu einem Projekt anwenden:

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 

die Lieder Form und die Alben bilden, schließen diese als Teil:

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

don ‚t schließen vergessen: html => {: mehrt => true} mit der Form

artworks_controller.rb

und schließlich, ein Auszug aus songs_controller.rb:

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

ahh, was ich brauchte, danke Brett! – kaigth

+0

@kaigth, Entschuldigung, ich habe dir einen solchen Umweg gegeben. Ich hätte damit gerade anfangen sollen. Die besten Wünsche. – Brett

+0

können die Styles für Anhänge im Artwork-Modell für Album und Song basierend auf polymorpher Beziehung unterschiedlich sein? – ramkumar

0

Ich bin mir nicht sicher, dass Sie wirklich polymorph sein müssen. Wie wäre es mit diesem Ansatz, der has_many: through nutzt? In einfachem Englisch hat der Benutzer einen Avatar, der mehrere Bilder hat, und durch diese Zuordnung können Sie User.images aufrufen, um die Sammlung von Bildern zu erhalten, die dem Avatar zugeordnet sind.

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 

all diesen Worten, ich bin übrig geblieben, warum Sie sich zu fragen, das alles sowieso brauchen, um zu gehen. Warum nicht einfach

, die geben Sie so viele Bilder (Avatare) wie Sie möchten.

+0

das ist fantastisch, aber ich möchte auch Avatare anhängen Beiträge zum Blog, ich müsste also noch polymorphe Assoziationen Beitrag :: Avatar – kaigth

+0

@kaigth würden Sie nicht Benutzer anhängen möchten verwenden Beiträge bloggen, und dann greifen sie ihren zugehörigen Avatar? – Brett

+0

@ Brett Ich möchte Menschen in der Lage, separate Avatare für Blog-Posts zuweisen, so dass ihre Beiträge einzigartig sein können anstelle eines Benutzers avatar – kaigth