On Thu, Dec 1, 2011 at 1:23 PM, Kioko --
<lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:
> Hi there,
>
> I''d be happy if someone can help me with the following:
> The application is for uploading all kinds of datafiles which should be
> displayed accordingly to their mimetypes.
>
> This is the class/database hierarchy of what I want to archive:
>
> Class:Filegroup
> has_many :binary
> Attributes are e.g. groupname, timestamps of upload/update and so on
>
> Class:Binary
> This is the generall description of the uploaded file
> Attributes included are e.g. original_filename, mimetype and so on
>
> If someone is uploading a file with a known mimetype, a (sub-)class
> should be created with specific details about the file e.g.
>
> Class:Image
> Including width, height...
>
> Class:Text
> Textstyle (php, xml)...
>
>
> I''d like to access the list of *all* files through something like:
> Filegroup.find(xxx).files iterates over it and render it automatically
> as it is specified in each of those sub-classes (so images whould be a
> thumbnail, text is shown fully and binary just a simple download link)
>
> I found the Polymorphic-attribute for the database associations but this
> is the other way round, isn''t it?
> Also I took a look at
>
>
http://archive.robwilkerson.org/2009/08/26/learning-ruby-on-rails-file-upload/index.html
> but this isn''t exactly what I need because the class which should
be
> used should be defined automatically.
> (E.g. somewhere is specified which class should be used for which
> mimetype)
>
I believe you need a mix of:
* STI from Binary to Image, Text etc.
* has_many relationships from Filegroup to
these different classes.
I set-up a project on
https://github.com/petervandenabeele/files
with as core files:
class Binary < ActiveRecord::Base
end
class Filegroup < ActiveRecord::Base
has_many :binaries
has_many :images
has_many :texts
end
class Image < Binary
def show
"this is an image of width #{width} and height #{height}"
end
end
class Text < Binary
def show
"This is a text of size #{size}"
end
end
and schema.rb :
ActiveRecord::Schema.define(:version => 20111203233119) do
create_table "binaries", :force => true do |t|
t.string "filename"
t.integer "filegroup_id"
t.string "type"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "height"
t.integer "width"
t.integer "size"
end
create_table "filegroups", :force => true do |t|
t.string "groupname"
t.datetime "created_at"
t.datetime "updated_at"
end
end
And then I can call:
fg.images.build
fg.texts.build
to _build_ instances of derived classes, but also
fg.binaries
to get back _all_ binaries (of different subclasses) where each
binary (image, text) has it''s own class specific implementation
of a show method (different for an Image and for a Text).
Is this what you where looking for ?
Peter
+++++++++++++++++++++++
peterv@ASUS:~/data/temp/files$ rails c
Loading development environment (Rails 3.1.3)
001:0> fg = Filegroup.create(:groupname => "home")
(0.1ms) SHOW search_path
(0.1ms) BEGIN
SQL (12.3ms) INSERT INTO "filegroups" ("created_at",
"groupname",
"updated_at") VALUES ($1, $2, $3) RETURNING "id"
[["created_at", Sat, 03
Dec 2011 23:46:03 UTC +00:00], ["groupname", "home"],
["updated_at", Sat,
03 Dec 2011 23:46:03 UTC +00:00]]
(0.6ms) COMMIT
=> #<Filegroup id: 1, groupname: "home", created_at:
"2011-12-03 23:46:03",
updated_at: "2011-12-03 23:46:03">
002:0> fg.images.create(:width => "400", :height =>
"200")
(0.2ms) BEGIN
SQL (1.5ms) INSERT INTO "binaries" ("created_at",
"filegroup_id",
"filename", "height", "size", "type",
"updated_at", "width") VALUES ($1,
$2, $3, $4, $5, $6, $7, $8) RETURNING "id" [["created_at",
Sat, 03 Dec
2011 23:46:34 UTC +00:00], ["filegroup_id", 1], ["filename",
nil],
["height", 200], ["size", nil], ["type",
"Image"], ["updated_at", Sat, 03
Dec 2011 23:46:34 UTC +00:00], ["width", 400]]
(0.6ms) COMMIT
=> #<Image id: 1, filename: nil, filegroup_id: 1, type: "Image",
created_at: "2011-12-03 23:46:34", updated_at: "2011-12-03
23:46:34",
height: 200, width: 400, size: nil>
003:0> fg.texts.create(:size => 4000)
(0.2ms) BEGIN
SQL (0.8ms) INSERT INTO "binaries" ("created_at",
"filegroup_id",
"filename", "height", "size", "type",
"updated_at", "width") VALUES ($1,
$2, $3, $4, $5, $6, $7, $8) RETURNING "id" [["created_at",
Sat, 03 Dec
2011 23:47:02 UTC +00:00], ["filegroup_id", 1], ["filename",
nil],
["height", nil], ["size", 4000], ["type",
"Text"], ["updated_at", Sat, 03
Dec 2011 23:47:02 UTC +00:00], ["width", nil]]
(0.7ms) COMMIT
=> #<Text id: 2, filename: nil, filegroup_id: 1, type: "Text",
created_at:
"2011-12-03 23:47:02", updated_at: "2011-12-03 23:47:02",
height: nil,
width: nil, size: 4000>
004:0> fg.binaries
Binary Load (0.9ms) SELECT "binaries".* FROM "binaries"
WHERE
"binaries"."filegroup_id" = 1
=> [#<Image id: 1, filename: nil, filegroup_id: 1, type:
"Image",
created_at: "2011-12-03 23:46:34", updated_at: "2011-12-03
23:46:34",
height: 200, width: 400, size: nil>, #<Text id: 2, filename: nil,
filegroup_id: 1, type: "Text", created_at: "2011-12-03
23:47:02",
updated_at: "2011-12-03 23:47:02", height: nil, width: nil, size:
4000>]
# Note that the 2 objects are of class Image and class Text (not of class
Binary) !
005:0> fg.binaries.each{|b| puts b.show}
this is an image of width 400 and height 200
This is a text of size 4000
...
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.