I''m making use of a global variable to do dynamic scoping in my models.
For example, here is how one model is defined:
class Invitation < ActiveRecord::Base
belongs_to :site
# Scope all find calls to the current site_id.
scoped_methods << {
:find => { :conditions => [ ''site_id =
?'',
$site_id ] }
}
end
In my ApplicationController, $site_id is set in a before_filter which
determines which subdomain the request came from. With this, I can
perform finds on my models without having to pass in the site_id every
time. This works well, although I understand it violates the MVC
philosophy - please bear with me.
It works well, except for tests. Actually, it works in tests if I
manually set $site_id, but *only if* I am *not* loading a fixture for
this model. For example, the following actually works (note that my
fixtures are commented out):
require File.dirname(__FILE__) + ''/../test_helper''
class InvitationTest < Test::Unit::TestCase
#fixtures :invitations
def test_global_wierdness
$site_id = 1
i = Invitation.find_by_last_name("Jones")
assert_valid i
end
end
So, if I run this test and watch my test.log file, I can verify that the
SQL query is run with site_id=1. All is good.
However, if I uncomment the fixtures line and watch my test.log file, I
find that $site_id is no longer visible within the model and my SQL
query ends up searching for site_id=NULL.
What exactly is going on here? Does loading a fixture somehow clobber
global variables? I''ve tried renaming the global $site_id to something
different (since that''s also a field in my Invitations table) but that
makes no difference.
Also, I can load fixtures for *other* models and the global variable
still works. It''s only when I load a fixture for the Invitation model
that it disappears.
I''ve been struggling with this problem for many hours and would be
greatly indebted to anyone who could educate me.
Thanks,
Scott
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
On 1 Oct 2007, at 22:49, Scott Garman wrote:> > So, if I run this test and watch my test.log file, I can verify > that the > SQL query is run with site_id=1. All is good. > > However, if I uncomment the fixtures line and watch my test.log > file, I > find that $site_id is no longer visible within the model and my SQL > query ends up searching for site_id=NULL. > > What exactly is going on here? Does loading a fixture somehow clobber > global variables? I''ve tried renaming the global $site_id to something > different (since that''s also a field in my Invitations table) but that > makes no difference. > >Rails overrides the setup method, and this is where the fixtures are loaded (ie before the code in test_global_weirdness runs). This causes invitation.rb to be loaded. At this point $site_id is not set and so when scoped_methods << {:find => { :conditions => [ ''site_id = ?'',$site_id ] } } is evaluated, $site_id is nil. If you don''t have invitations as a fixture, then invitation.rb is only loaded when Invitation is used, i.e. after you''ve set $site_id. So it''s not that fixtures are clobbering anything. You''ll also have problems if different tests try to set $site_id to different values. Fundamentally this approach seems unwise. If you absolutely had to, you could set $site_id in test_helper.rb Fred --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Frederick Cheung wrote:> Rails overrides the setup method, and this is where the fixtures are > loaded (ie before the code in test_global_weirdness runs). This > causes invitation.rb to be loaded. At this point $site_id is not set > and so when scoped_methods << {:find => { :conditions => [ ''site_id > = ?'',$site_id ] } } is evaluated, $site_id is nil.Fred, I can''t thank you enough for such a clear explanation. I''m evaluating other ways of scoping my models, but you''ve resolved this particular mystery. Thanks, Scott -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---