用户在导轨3中使用回形针有许多图像

时间:2013-12-12 08:22:41

标签: ruby-on-rails ruby-on-rails-3 polymorphism paperclip

我一直在使用paperclip模型为user has_many :imagesimage belongs_to:user。现在我想让多态为图像模型工作,以便用户,帖子有很多图像和image belongs to imageable polymorphic=>true。我正在研究它,但我不自信,因为我不清楚回形针的概念。现在这些是我所做的改变,但我还需要进行哪些进一步的改动得到一个关联为user has many imagesimages belongs to imageable ,polymorphic =>true.以下是我所做的但没有得到任何结果。任何帮助将不胜感激... 。我只需要图像的多态性,如用户有许多图像,帖子有很多图像.....等图像属于可成像的,:polymorphic = true。

image.rb

belongs_to :imageable,:polymorphic=>true
has_attached_file :avatar, :url  => "/assets/images/#{imageable_type}/#{imageable_id}/:style/:basename.:extension",
             :path => ":rails_root/public/assets/images/#{imageable_type}/#{imageable_id}/:style/:basename.:extension", :default_url => 'dashboard/default_avatar.jp

G'

user.rb

has many:images ,:as=>imageable,:dependent=>destroy

将文件迁移到图片

class CreateImages < ActiveRecord::Migration
  def change
    create_table :images do |t|
      t.string :name
      t.references :site
      t.string :image_file_name, :null => true
      t.string :image_content_type, :null => true
      t.integer :image_file_size, :null => true
      t.timestamps
    end
  end
end

迁移user.rb

class CreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      t.string :first_name
      t.string :last_name
      t.string :username
      t.string :mobile_number
      t.string :email
      t.references :image
      t.timestamps
    end

我的观看表单,我将允许用户上传图片或编辑图片

profile.html.erb .....使用remotipart gem

<%= form_for(@user,:url=>'add_image_to_user_path',:html => {:multipart => true},:remote=>true) do |f |%>
<%= f.file_field :images, :multiple => true %>
<%= f.submit "Add image" %>
<%end%>

users_controller.rb

    ##now how i should update the users image who has already logged in
    ##i tried @user.update_attribute(params[:user]) but i cannot see any update query in the log
 -   ##i can only see --->paperclip saving attachment
    def add_image_to_user
       @user=User.new
    end

2 个答案:

答案 0 :(得分:1)

听起来像你需要一个has_many :through association。这样您就可以将imageuserpost模型分开了

我认为您的问题是,您要限制图片与特定对象的关联,您希望将这些对象分配给postuser


Has_Many通过

在我们公司,我们只提出images belong_to :user(出于授权目的)。对于其他一切,我们使用带有has_many的连接模型:通过关联,因为这允许您创建任意数量的关联

以下是我们的工作方式:

#app/models/image.rb
Class Image < ActiveRecord::Base
    has_many :image_posts, :class_name => 'ImagePost'
    has_many :posts, :class_name => 'Post', :through => :image_posts

    has_many :user_images, :class_name => 'UserImage'
    has_many :users, :class_name => 'User', :through => :user_images
end

#app/models/user.rb
Class User < ActiveRecord::Base
    has_many :user_images, :class_name => 'UserImage'
    has_many :images, :class_name => 'Image', :through => :user_images
end

#app/models/post.rb
Class Post < ActiveRecord::Base
    has_many :image_posts, :class_name => 'ImagePost'
    has_many :images, :class_name => 'Image', :through => :image_posts
end

#app/models/ImagePost.rb
Class ImagePost < ActiveRecord::Base
    belongs_to :image
    belongs_to :post
end

   #app/models/UserImage.rb
   Class UserImage < ActiveRecord::Base
        belongs_to :image
        belongs_to :user
   end

联接模型在数据库中将如下所示:

user_images
id | user_id | image_id | extra | attributes | created_at | updated_at

image_posts
id | post_id | image_id | extra | attributes | created_at | updated_at

这意味着您可以使用accepts_nested_attributes_forimage_iduser分配post。由于连接模型正在处理关联,因此图像保持不变。如果您认为适用,我可以发布如何执行此操作

答案 1 :(得分:0)

你的问题与回形针无关,它与多态关联有关。现在,多态关联与常规关联非常相似 - 从DB模式的角度来看,唯一的区别是存在另一列&#34;属于&#34;模型(在您的情况下,它是imageable_type),包含相关记录的类。因此,首先,您应该从t.references :image迁移中移除create_users,因为它不必要。其次,您应该将外键列和关联类型列添加到create_images迁移。您可以使用单个&#39;指令&#39;来执行此操作,如下所示:

t.references :imageable, polymorphic: true

这应该足够了。