Greg Ma wrote in post #970946:
Hi,
I have a polymorphic Image model that I am using on 2 very different
models.
I would like to have different image styles depending on the model.
I have been searching everywhere for an answer but I haven't be able to
find something.
I assume you would need to know, for a certain "image", for which of
your 2 models this is used.
I am not familiar with Paperclip, but in general, if you use a
polymorphic asociation, it is easy to find out to which model this
"Image" object is linked to with self.association.class .
I made a little mock-up where an Image class has a polymorphic
belongs_to
association to classes "Person" and "User". What you could do is decide
based on the class of the result of the association what you are looking
at:
class Image < ActiveRecord::Base
belongs_to :someone, :polymorphic => true
end
rails c
Loading development environment (Rails 3.0.3)
001:0> image_1 = Image.new(:url => "http://flickr…")
=> #<Image id: nil, url: "http://flickr…", someone_type: nil,
someone_id: nil, created_at: nil, updated_at: nil>
002:0> image_1.someone = User.first
=> #<User id: 1, first_name: "Jon", last_name: nil, user_name: nil,
testing: nil, created_at: "2010-12-23 21:57:01", updated_at: "2010-12-23
21:57:01">
003:0> image_1.save!
=> true
004:0> image_2 = Image.new(:url => "http://picassa…", :someone =>
Person.first)
=> #<Image id: nil, url: "http://picassa…", someone_type: "Person",
someone_id: 1, created_at: nil, updated_at: nil>
005:0> image_2.save!
=> true
006:0> Image.all
=> [#<Image id: 3, url: "http://flickr…", someone_type: "User",
someone_id: 1, created_at: "2010-12-27 20:45:01", updated_at:
"2010-12-27 20:45:01">, #<Image id: 4, url: "http://picassa…",
someone_type: "Person", someone_id: 1, created_at: "2010-12-27
20:45:36", updated_at: "2010-12-27 20:45:36">]
007:0> image_1.someone.class
=> User(id: integer, first_name: string, last_name: string, user_name:
string, testing: string, created_at: datetime, updated_at: datetime)
008:0> image_2.someone.class
=> Person(id: integer, first_name: text, last_name: text, birth_date:
date, gsm_number: text, comment: string, created_at: datetime,
updated_at: datetime)
009:0> image_1.someone.class == User
=> true
010:0> image_1.someone.class == Person
=> false
The 'image.someone.class' will tell you if this image is used for
a Person or for a User.
At a deeper level, one could also inspect the content of
image.someone_type, but I feel that is not as clean, since this
relies on the internals of a particular implementation of the
polymorphic assocation.
011:0> image_1.someone_type
=> "User"
012:0> image_2.someone_type
=> "Person"
HTH,
Peter