6

我想與回形針做多態關聯,並允許我的用戶有一個化身和多個圖像。rails 3與回形針和多個模型的多態關聯

附件模型:

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

當我嘗試保存更改出現錯誤=>未知屬性:化身

如果刪除:在HAS_ONE關聯我得到錯誤=> 未初始化的常數用戶CLASS_NAME>「附着」 ::頭像

我還需要附加的化身,以博客,所以我需要聯想到是多態的(或至少我這麼認爲)

我難倒任何幫助,將不勝感激。

回答

6

我確實有一個成功使用Paperclip和多態關聯的項目。讓我告訴你我有什麼,也許你可以把它應用到你的項目:

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

唐「T忘記包括: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 

最後,從songs_controller摘錄。RB:

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

啊,就是我所需要的,謝謝Brett! – kaigth

+0

@kaigth,對不起,我給了你這樣一個繞圈。我應該剛剛開始。最好的祝願。 – Brett

+0

基於多態關係,藝術品模型中附件的樣式可以不同於專輯和歌曲嗎? – ramkumar

0

我不確定你是否真的需要多態。這種方法如何使用has_many:through?用簡單的英語,用戶有一個具有多個圖像的頭像,並且通過該關聯,您可以調用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

多數民衆贊成真棒,但我也想化身連接到博客,所以我仍然需要使用多態關聯後::頭像 – kaigth

+0

@kaigth你豈不要附加用戶博客,和然後抓住他們相關的頭像? – Brett

+0

@ Brett我希望人們能夠爲博客文章分配獨立的頭像,所以他們的帖子可以是唯一的,而不是用戶頭像 – kaigth