2011-11-24 49 views
1

更新: 我设置了一些运行时模型的默认范围,这似乎在我的开发环境中本地工作,我的代码如下。默认的作用域混淆

 
SET_OF_MODELS = [Event, Group, User] 
 
@account = Account.find_by_subdomain(account_subdomain) 
SET_OF_MODELS.each { |m| m.set_default_scope(@account.id) } 
 
def set_default_scope(account_id) 
default_scope :conditions=> { :account_id => account_id } 
end 

如果我说@帐户1 @帐户1用户,而如果我@重复代码帐户2,然后User.first回报@帐户1用户,而不是@帐户2的执行在Ruby控制台这段代码,User.first回报。而在本地服务器中运行应用程序时,此问题并未显示,但在登台服务器中。

我的猜测是他们的状态,如果他们真的被缓存但不确定。有人可以深入解释。

在此先感谢

+0

为什么不使用更传统的方式,使用@ account.user? – suweller

回答

0

上述代码没有任何问题,但问题出在服务器上,即瘦服务器上。在用杂种更换薄后,它完美地工作。除了加载应用程序之外,我认为thin不允许多次执行set_default_scope。

1

default_scope将在同级车保存状态。它在并发环境中是有害的,因为它会导致竞争状态。所以你必须隔离请求之间的范围状态。

您可以使用around_filter

class ApplicationController < ActionController::Base 
    around_filter :set_default_scope 
    def set_default_scope 
    @account = Account.find_by_subdomain(account_subdomain) 
    opts = :condition => {:account_id => @account.id} 
    Event.send(:with_scope, opts) do 
     Group.send(:with_scope, opts) do 
     User.send(:with_scope, opts) do 
      yield 
     end 
     end 
    end 
    end 
end 

您可以重构.send(:with_scope, opts)一类方法一样with_account_scope(account_id)

+0

感谢您的努力@ShiningRay。我仍然不确定这个错误,因为你说的可能是上面的代码在我的开发和生产环境中工作,但不在环境变化环境中。 :( – a5his

1

发展从生产不同。在生产中,所有类都被加载一次并被缓存,所以你不能在每个请求中重新定义默认的作用域。 在开发过程中,每个请求都会加载类,以便于开发:您在代码中执行的每个更改都会在下一个请求中可见/活动。

如果您确实想要,可以在生产中禁用此行为。这会让你的网站变慢,但也许这不是问题。要关闭此功能,你有你的编辑config/environments/production.rb,发现含有

config.cache_classes = true 

线路和开关,为false

希望这会有所帮助。

+0

感谢@nathanvda,但重新定义默认范围工作在开发和生产,但不在分期,这是真的很奇怪,因为'cache_classes'在production.rb中设置为true对此的任何建议? – a5his

+0

您是否尝试将其设置为'假'' – nathanvda

+0

不,我还没有尝试过,但我认为在分期设置错误将解决我的分期问题,但如何重新定义默认范围正在生产与'cache_classes'真实? – a5his