2016-05-11 12 views
4

Ich habe Picture-Modell, die Bilder von der ganzen App speichern, in einer speicherbaren Spalte Ich bewahre Image Owner-Objekt. Ich möchte eine Möglichkeit haben, diese Bilder mit unterschiedlicher Auflösung zu speichern.Schienen 4.2.6 + Polymorph + Carrierwave 0.10 + Bedingungen

class Picture < AbstractModel 
    belongs_to :imageable, polymorphic: true 
    mount_uploader :image, ImageUploader 
end 

class User < AbstractModel 
    has_one :picture, class_name: Picture, as: :imageable, dependent: :destroy 
    accepts_nested_attributes_for :picture 
end 

class Event < AbstractModel 
    has_one :picture, class_name: Picture, as: :imageable, dependent: :destroy 
    accepts_nested_attributes_for :picture 
end 

In Carrierwave habe ich

class ImageUploader < CarrierWave::Uploader::Base 
    version :xs if: :for_user? do 
    process resize_to_fit: [100, 100] 
    end 

    private 

    def for_user?(_picture) 
     # And here I hit the problem! 
     # model.is_a? User 
    end 
end 

gemacht, wie ich hier, um das Bild Inhabermodell holen kann?

model Variable Referenzen auf Picture Modell, ich habe alle vars mit pry versucht, aber es ist nicht gelungen.

Natürlich kann ich Bild-Link direkt in Benutzer und Ereignis in diesem Snippet speichern, aber in Realworld Code habe ich etwa 15 verschiedene Modelle mit Bildern und ich muss eine Möglichkeit bieten, es in ActiveAdmin CMS zu bearbeiten (aber es ist eine andere Geschichte :)

UPDATE

Das Hauptproblem passiert, wenn ich neuen Datensatz erstellen. Also, ich habe versucht, inverse_of hinzuzufügen, aber es hat nicht geholfen.

class Picture < AbstractModel 
    belongs_to :imageable, polymorphic: true, inverse_of: :pictures 
    mount_uploader :image, ImageUploader 

class User < AbstractModel 
    has_one :picture, class_name: Picture, as: :imageable, dependent: :destroy, inverse_of: :imageable 
    accepts_nested_attributes_for :picture 

ist hier Zustand model in for_user? Methode

[5] pry(#<ImageUploader>)> ap model 
Изображение для { 
       :id => nil, 
      :image => #<ImageUploader:0x005583dee8f938 @model=#<Picture id: nil, image: nil, imageable_id: nil, imageable_type: nil, created_at: nil, updated_at: nil>, @mounted_as=:image, @cache_id="1463023347-21567-5096", @filename="rootp_HE_pause-20160113_141810.jpg", @original_filename="rootp_HE_pause-20160113_141810.jpg", @file=#<CarrierWave::SanitizedFile:0x005583dee8cf30 @file="/home/kvokka/proj/volunteers/public/uploads/tmp/1463023347-21567-5096/rootp_HE_pause-20160113_141810.jpg", @original_filename=nil, @content_type="image/jpeg">, @versions={:mini=>#<ImageUploader::Uploader47012442238420:0x005583dee724a0 @model=#<Picture id: nil, image: nil, imageable_id: nil, imageable_type: nil, created_at: nil, updated_at: nil>, @mounted_as=:image>, :xs=>#<ImageUploader::Uploader47012435752020:0x005583dee72450 @model=#<Picture id: nil, image: nil, imageable_id: nil, imageable_type: nil, created_at: nil, updated_at: nil>, @mounted_as=:image>, :avatar=>#<ImageUploader::Uploader47012437005860:0x005583dee72428 @model=#<Picture id: nil, image: nil, imageable_id: nil, imageable_type: nil, created_at: nil, updated_at: nil>, @mounted_as=:image>}>, 
     :imageable_id => nil, 
    :imageable_type => nil, 
     :created_at => nil, 
     :updated_at => nil 

UPDATE2

Ich habe thried mit inverse_of: Bild und mit inverse_of: Bilder. Syntax-Fehler. Es läuft mit inverse_of:: bebilderbar, aber das Ergebnis ist das gleiche.

letzte Version von ImageUploader (ich es aus Gründen der Kürze geschnitten haben) ist

class ImageUploader < CarrierWave::Uploader::Base 
    version :xs do 
    process resize_to_fit: [100, 100] 
    end 

    version :avatar, if: :for_user? do 
    process resize_to_fit: [360, 360] 
    end 

    private 

    def for_user?(_) 
     model.imageable.is_a? User 
    end 
end 

UPDATE3

Ich habe einige Konsole bewegt gemacht, damit Sie sehen können, dass Modell verschachtelte Attribute akzeptiert . Im Falle der Beziehung funktioniert es auch ohne #inverse_of Methode (und dieser Moment ist schwierig für mich). Also, das Protokoll:

[43] pry(main)> ap v = VolunteerCenter.create(title: 'tst', address:'tst', city: City.first, phone:'123456',email: '[email protected]', description: 'ololo', link: 'http://ddd.ru', picture: (Picture.new(remote_image_url: 'https://retina.news.mail.ru/prev780x440/pic/e5/35/image25749462_adfc024a9b54b718c1a755445661b099.jpg'))) 
    City Load (0.8ms) SELECT "cities".* FROM "cities" ORDER BY "cities"."id" ASC LIMIT 1 
    (0.2ms) BEGIN 
    SQL (0.4ms) INSERT INTO "volunteer_centers" ("title", "address", "city_id", "phone", "email", "description", "link", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING "id" [["title", "tst"], ["address", "tst"], ["city_id", 1], ["phone", "123456"], ["email", "[email protected]"], ["description", "ololo"], ["link", "http://ddd.ru"], ["created_at", "2016-05-12 12:13:44.417945"], ["updated_at", "2016-05-12 12:13:44.417945"]] 
    SQL (0.3ms) INSERT INTO "pictures" ("image", "imageable_type", "imageable_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["image", "image25749462_adfc024a9b54b718c1a755445661b099.jpg"], ["imageable_type", "VolunteerCenter"], ["imageable_id", 11], ["created_at", "2016-05-12 12:13:44.421458"], ["updated_at", "2016-05-12 12:13:44.421458"]] 
    (2.2ms) COMMIT 
tst { 
      :id => 11, 
      :title => "tst", 
    :created_at => Thu, 12 May 2016 12:13:44 UTC +00:00, 
    :updated_at => Thu, 12 May 2016 12:13:44 UTC +00:00, 
     :address => "tst", 
     :city_id => 1, 
      :phone => "123456", 
      :email => "[email protected]", 
    :description => "ololo", 
     :vk_link => nil, 
      :link => "http://ddd.ru" 
} 
=> nil 
[44] pry(main)> ap v.picture 
    VolunteerCenter Load (0.6ms) SELECT "volunteer_centers".* FROM "volunteer_centers" WHERE "volunteer_centers"."id" = $1 LIMIT 1 [["id", 11]] 
Изображение для tst { 
       :id => 120, 
      :image => #<ImageUploader:0x0055596544d928 @model=#<Picture id: 120, image: "image25749462_adfc024a9b54b718c1a755445661b099.jpg", imageable_id: 11, imageable_type: "VolunteerCenter", created_at: "2016-05-12 12:13:44", updated_at: "2016-05-12 12:13:44">, @mounted_as=:image, @cache_id=nil, @filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @file=#<CarrierWave::SanitizedFile:0x00555963f0c690 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename=nil, @content_type="image/jpeg">, @versions={:mini=>#<ImageUploader::Uploader46921211280280:0x00555966c55890 @model=#<Picture id: 120, image: "image25749462_adfc024a9b54b718c1a755445661b099.jpg", imageable_id: 11, imageable_type: "VolunteerCenter", created_at: "2016-05-12 12:13:44", updated_at: "2016-05-12 12:13:44">, @mounted_as=:image, @parent_cache_id="1463055224-8966-4735", @cache_id=nil, @filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @file=#<CarrierWave::SanitizedFile:0x00555966e89620 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/mini_image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename=nil, @content_type="image/jpeg">, @versions={}, @storage=#<CarrierWave::Storage::File:0x00555966e8a4a8 @uploader=#<ImageUploader::Uploader46921211280280:0x00555966c55890 ...>>>, :xs=>#<ImageUploader::Uploader46921211274220:0x00555966c55868 @model=#<Picture id: 120, image: "image25749462_adfc024a9b54b718c1a755445661b099.jpg", imageable_id: 11, imageable_type: "VolunteerCenter", created_at: "2016-05-12 12:13:44", updated_at: "2016-05-12 12:13:44">, @mounted_as=:image, @parent_cache_id="1463055224-8966-4735", @cache_id=nil, @filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @file=#<CarrierWave::SanitizedFile:0x005559659d60c0 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/xs_image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename=nil, @content_type="image/jpeg">, @versions={}, @storage=#<CarrierWave::Storage::File:0x005559659d7010 @uploader=#<ImageUploader::Uploader46921211274220:0x00555966c55868 ...>>>, :avatar==>#<ImageUploader::Uploader46921211257860:0x00555966c55840 @model=#<Picture id: 120, image: "image25749462_adfc024a9b54b718c1a755445661b099.jpg", imageable_id: 11, imageable_type: "VolunteerCenter", created_at: "2016-05-12 12:13:44", updated_at: "2016-05-12 12:13:44">, @mounted_as=:image, @parent_cache_id="1463055224-8966-4735", @cache_id=nil, @filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @file=#<CarrierWave::SanitizedFile:0x00555963379328 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/avatar=_image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename=nil, @content_type="image/jpeg">, @versions={}, @storage=#<CarrierWave::Storage::File:0x0055596337a390 @uploader=#<ImageUploader::Uploader46921211257860:0x00555966c55840 ...>>>}, @storage=#<CarrierWave::Storage::File:0x00555965d85fb8 @uploader=#<ImageUploader:0x0055596544d928 ...>>>, 
     :imageable_id => 11, 
    :imageable_type => "VolunteerCenter", 
     :created_at => Thu, 12 May 2016 12:13:44 UTC +00:00, 
     :updated_at => Thu, 12 May 2016 12:13:44 UTC +00:00 
} 

Update4

Diese happents, wenn ich mit hebeln in Callback-Methode ausgeführt werden.

class ImageUploader < CarrierWave::Uploader::Base 
    version :avatar, if: :for_user? do 
    puts 'This line never run' 
    process resize_to_fit: [360, 360] 
    end 

    private 

    def for_user?(picture) 
     binding.pry 
     model.imageable.is_a? User 
    end 

Ich schalte alle Validierungen zur Klärung aus. Dieser Rückruf wird 3 mal aufgerufen, und in ersten 2 User Instanz ist nicht bereit, und nach dem letzten der Rückruf nicht funktionieren.

[46] pry(main)> ap u = User.create(email: '[email protected]', password: '123456', password_confirmation: '123456', picture: (Picture.create remote_image_url: 'http://onrails.club/uploads/default/29/31f7627609164af8.png')) 

From: /home/kvokka/proj/volunteers/app/uploaders/image_uploader.rb @ line 68 ImageUploader#for_user?: 

    66: def for_user?(_) 
    67: binding.pry 
=> 68: model.imageable.is_a? User 
    69: end 

@cache_id    "1463060913-8966-3349" 
@file     #<CarrierWave::SanitizedFile:0x00555963268330 @file="/hom... 
@filename    "31f7627609164af8.png" 
@model     #<Picture id: nil, image: nil, imageable_id: nil, imageab... 
@mounted_as    :image 
@original_filename  "31f7627609164af8.png" 
@versions    {:mini=>#<ImageUploader::Uploader46921199022860:0x0055596... 
[1] pry(#<ImageUploader>)> 

From: /home/kvokka/proj/volunteers/app/uploaders/image_uploader.rb @ line 68 ImageUploader#for_user?: 

    66: def for_user?(_) 
    67: binding.pry 
=> 68: model.imageable.is_a? User 
    69: end 

@cache_id    "1463060913-8966-3349" 
@file     #<CarrierWave::SanitizedFile:0x00555963268330 @file="/hom... 
@filename    "31f7627609164af8.png" 
@model     #<Picture id: nil, image: nil, imageable_id: nil, imageab... 
@mounted_as    :image 
@original_filename  "31f7627609164af8.png" 
@versions    {:mini=>#<ImageUploader::Uploader46921199022860:0x0055596... 
[1] pry(#<ImageUploader>)> 
    (0.3ms) BEGIN 
    SQL (0.7ms) INSERT INTO "pictures" ("image", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["image", "31f7627609164af8.png"], ["created_at", "2016-05-12 13:48:40.071387"], ["updated_at", "2016-05-12 13:48:40.071387"]] 

From: /home/kvokka/proj/volunteers/app/uploaders/image_uploader.rb @ line 68 ImageUploader#for_user?: 

    66: def for_user?(_) 
    67: binding.pry 
=> 68: model.imageable.is_a? User 
    69: end 

@cache_id    nil 
@file     #<CarrierWave::SanitizedFile:0x005559639c6348 @file="/hom... 
@filename    "31f7627609164af8.png" 
@model     #<Picture id: 112, image: "31f7627609164af8.png", imageab... 
@mounted_as    :image 
@original_filename  "31f7627609164af8.png" 
@storage     #<CarrierWave::Storage::File:0x00555963b5add0 @uploader=#... 
@versions    {:mini=>#<ImageUploader::Uploader46921199022860:0x0055596... 
[1] pry(#<ImageUploader>)> 
    (2.9ms) COMMIT 
    (0.2ms) BEGIN 
    User Exists (0.7ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1 
    SQL (0.4ms) INSERT INTO "users" ("email", "encrypted_password", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["email", "[email protected]"], ["encrypted_password", "$2a$11$qq8tVgzISJguKz7oVJWyVO45vW/ujSEsi/ow29w78nC9ByOdjrPYK"], ["created_at", "2016-05-12 13:48:41.761836"], ["updated_at", "2016-05-12 13:48:41.761836"]] 
    SQL (0.4ms) UPDATE "pictures" SET "imageable_type" = $1, "imageable_id" = $2, "updated_at" = $3 WHERE "pictures"."id" = $4 [["imageable_type", "User"], ["imageable_id", 31], ["updated_at", "2016-05-12 13:48:41.764681"], ["id", 112]] 
    (2.7ms) COMMIT 
, { 
          :id => 31, 
         :email => "[email protected]", 
      :encrypted_password => "$2a$11$qq8tVgzISJguKz7oVJWyVO45vW/ujSEsi/ow29w78nC9ByOdjrPYK", 
     :reset_password_token => nil, 
     :reset_password_sent_at => nil, 
      :remember_created_at => nil, 
       :sign_in_count => 0, 
      :current_sign_in_at => nil, 
       :last_sign_in_at => nil, 
      :current_sign_in_ip => nil, 
       :last_sign_in_ip => nil, 
        :created_at => Thu, 12 May 2016 13:48:41 UTC +00:00, 
        :updated_at => Thu, 12 May 2016 13:48:41 UTC +00:00, 
         :name => nil, 
         :surname => nil, 
         :phone => nil, 
          :dob => nil, 
         :gender => nil, 
         :height => nil, 
         :about => nil, 
     :information_source_id => nil, 
       :institution_id => nil, 
       :clothes_size_id => nil, 
         :city_id => nil, 
      :volunteer_center_id => nil, 
        :blood_id => nil, 
       :vkontakte_link => nil, 
    :medical_contraindications => nil 
} 
=> nil 

Die Frage ist noch offen

Antwort

0

Wie ich hier das Bild Eigentümer Modell holen kann?

Unter der Annahme, dass Sie einen Benutzerdatensatz beziehen, wenn Sie "Bild Inhabermodell" sagen, dann könnten Sie die folgenden Schritte aus

class ImageUploader < CarrierWave::Uploader::Base 
    ... 
    def for_user?(picture) 
    user = model.imageable 
    user.is_a? User 
    # => true 
    end 
    ... 
end 

Von docs:

  • picture Parameter ist das hochgeladene Dateiobjekt (dies ist keine Instanz Ihres Picture-Modells)

  • model ist der Verweis auf ein Instanzobjekt, in dem Sie dieses ImageUploader verwenden, das in Ihrem Fall auf eine Instanz des Modells Picture verweist. Beachten Sie, dass sich dies von picture oben unterscheidet.

Nun, da Sie model wissen, ist eine Instanz von Picture, und dass Picture belongs_to :imageable, und dass :imageable eine polymorphe Vereinigung ist das eigentlich ein User Datensatz in Ihrem Fall ist, dann können Sie den dazugehörigen Datensatz mit meiner Antwort zugreifen oben . Beachten Sie jedoch, dass es sich möglicherweise nicht immer um einen User Datensatz handelt, da es sich um eine polymorphe Assoziation handelt. wird aufgebaut aus verschachteltem params

UPDATE

Ich model.imageable rate nicht funktioniert, weil die bebilderbare Datensatz Null nach ist.

Können Sie versuchen

class Picture < AbstractModel 
    belongs_to :imageable, polymorphic: true, inverse_of: :picture # WITHOUT s 

UPDATE

wie inverse_of Sieht nicht mit polymorphen Assoziation funktioniert (here und here)

Es gibt ein paar Einschränkungen Unterstützung inverse_of :

  • Sie arbeiten nicht mit: durch Assoziationen.
  • Sie arbeiten nicht mit: polymorphe Assoziationen.
  • Sie arbeiten nicht mit: als Assoziationen.
  • Bei assignes_to-Zuordnungen werden has_many inverse Zuordnungen ignoriert.

P.S. Dies könnte schwierig sein. Wenn ich die Zeit später habe, werde ich versuchen, das Problem zu reproduzieren.

+0

Danke, aber es hat nicht geholfen. Ich habe die Frage aktualisiert und einige Details hinzugefügt, daher kann es nützlich sein. Ihre Idee wird nur für die Aktualisierung des Bildes verzweigen, und für neue werde ich alle Versionen erfassen. –

+0

Ich habe meine Antwort aktualisiert. Können Sie versuchen, ob es funktioniert? –

+0

Danke. Ich habe es gewagt: Bild und: Bilder. Syntax-Fehler. Es läuft mit inverse_of:: bebilderbar, aber das Ergebnis ist das gleiche. –