Stefano Crocco
1/25/2009 8:13:00 AM
Alle domenica 25 gennaio 2009, Daniel Waite ha scritto:
> (The code I will demonstrate is Rails-based, but the question is
> Ruby-based.)
>
> I'm familiar with the following:
> ActiveRecord::Base
>
> Basically says, look inside ActiveRecord for a class or module named
> Base.
>
> But what about the following:
> ::Attachment
> Does that basically say, no matter what scope you are in, jump to the
> highest level to look for the class or module named Attachment?
According to "The Ruby Programming Language", ::Something is a shortcut for
Object::Something. The idea is that ::Something should look up a constant
called Something in the global scope, but since ruby doesn't truly have a
global scope, it looks it up in the Object class, which is the nearest thing
in ruby to a global scope.
> The following code only works when I prefix the Attachment class with ::
>
> has_one :attachment, :as => :attachable, :class_name => '::Attachment'
>
> def assign_attachment=(attachment_id)
> self.attachment = ::Attachment.find(attachment_id)
> end
Not knowing rails, I can't say much on this. However, if it works with
::Attachment and doesn't work with Attachment, the only thing I can think of
is that you have two constants called Attachment: one at global level, which
is the one you need here, and another at a more local level which is the one
you get without the ::
I hope this helps
Stefano