Commit f8dd07ca

mo khan <mo@mokhan.ca>
2014-09-20 03:41:09
make photos polymorphic.
1 parent 05dd5e7
app/controllers/my/avatars_controller.rb
@@ -6,7 +6,7 @@ module My
     end
 
     def update
-      UploadAvatar.new.run(@avatar, params)
+      UploadAvatar.new.run(current_user, params)
       redirect_to edit_my_avatar_path(current_user), :notice => t(:avatar_uploaded)
     end
 
app/models/creation.rb
@@ -3,7 +3,7 @@ class Creation < ActiveRecord::Base
   validates :category_id, presence: true
   belongs_to :user, :counter_cache => true
   belongs_to :category
-  has_many :photos, -> { order :created_at }, :dependent => :destroy
+  has_many :photos, -> { order :created_at }, dependent: :destroy, as: :imageable
   has_many :favorites, :dependent => :destroy
   has_many :comments, dependent: :destroy
   acts_as_taggable
app/models/photo.rb
@@ -1,5 +1,5 @@
 class Photo < ActiveRecord::Base
-  belongs_to :creation, counter_cache: true, touch: true
+  belongs_to :imageable, polymorphic: true, counter_cache: true, touch: true
 
   def url_for(version_key, asset_host = ENV['ASSET_HOST'])
     versions.find { |version| version.for?(version_key) }.url_for(asset_host)
app/services/application/handlers/process_avatar.rb
@@ -0,0 +1,25 @@
+class ProcessAvatar
+  def initialize()
+  end
+
+  def handles?(event)
+    :upload_avatar == event
+  end
+
+  def handle(message)
+    user = User.find(message[:user_id])
+    #avatar = avatar_for(user)
+  end
+
+  private
+
+  def avatar_for(user)
+    if user.avatar.nil?
+      avatar = user.avatar = Avatar.new
+      user.save
+      return avatar
+    else
+      user.avatar
+    end
+  end
+end
app/services/application/upload_avatar.rb
@@ -3,16 +3,16 @@ class UploadAvatar
     @message_bus = message_bus
   end
 
-  def run(avatar, params)
-    @message_bus.publish(:upload_avatar, create_message_from(avatar, params))
+  def run(user, params)
+    @message_bus.publish(:upload_avatar, create_message_from(user, params))
   end
 
   private
 
-  def create_message_from(avatar, payload)
+  def create_message_from(user, payload)
     image = payload[:avatar][:avatar]
     {
-      cake_id: avatar.id,
+      user_id: user.id,
       file_path: move_to_temporary_storage(image),
       original_filename: image.original_filename,
       content_type: image.content_type,
db/migrate/20140920032230_make_photos_polymorphic.rb
@@ -0,0 +1,6 @@
+class MakePhotosPolymorphic < ActiveRecord::Migration
+  def change
+    rename_column :photos, :creation_id, :imageable_id
+    add_column :photos, :imageable_type, :string
+  end
+end
db/migrate/20140920033516_migrate_old_photos.rb
@@ -0,0 +1,7 @@
+class MigrateOldPhotos < ActiveRecord::Migration
+  def change
+    Photo.find_each do |photo|
+      photo.update_attribute(:imageable_type, 'Creation')
+    end
+  end
+end
db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20140909030826) do
+ActiveRecord::Schema.define(version: 20140920033516) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -108,7 +108,7 @@ ActiveRecord::Schema.define(version: 20140909030826) do
   end
 
   create_table "photos", force: true do |t|
-    t.integer  "creation_id"
+    t.integer  "imageable_id"
     t.string   "image"
     t.datetime "created_at"
     t.datetime "updated_at"
@@ -120,9 +120,10 @@ ActiveRecord::Schema.define(version: 20140909030826) do
     t.float    "longitude"
     t.string   "sha256"
     t.string   "watermark"
+    t.string   "imageable_type"
   end
 
-  add_index "photos", ["creation_id"], name: "index_photos_on_creation_id", using: :btree
+  add_index "photos", ["imageable_id"], name: "index_photos_on_imageable_id", using: :btree
 
   create_table "taggings", force: true do |t|
     t.integer  "tag_id"