我一直在使用paperclip
模型为user has_many :images
和image belongs_to:user
。现在我想让多态为图像模型工作,以便用户,帖子有很多图像和image belongs to imageable polymorphic=>true
。我正在研究它,但我不自信,因为我不清楚回形针的概念。现在这些是我所做的改变,但我还需要进行哪些进一步的改动得到一个关联为user has many images
和images 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
答案 0 :(得分:1)
听起来像你需要一个has_many :through
association。这样您就可以将image
,user
和post
模型分开了
我认为您的问题是,您要限制图片与特定对象的关联,您希望将这些对象分配给post
或user
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_for
为image_id
或user
分配post
。由于连接模型正在处理关联,因此图像保持不变。如果您认为适用,我可以发布如何执行此操作
答案 1 :(得分:0)
你的问题与回形针无关,它与多态关联有关。现在,多态关联与常规关联非常相似 - 从DB模式的角度来看,唯一的区别是存在另一列&#34;属于&#34;模型(在您的情况下,它是imageable_type
),包含相关记录的类。因此,首先,您应该从t.references :image
迁移中移除create_users
,因为它不必要。其次,您应该将外键列和关联类型列添加到create_images
迁移。您可以使用单个&#39;指令&#39;来执行此操作,如下所示:
t.references :imageable, polymorphic: true
这应该足够了。