在模型上为请求的其余部分设置范围

问题描述:

我想知道是否有办法在模型类上为请求的其余部分设置范围?即我想要缩小一些结果的范围,但是我想在没有主要的宁静控制器知道的情况下这样做(可能在注入控制器的before_filter中)。在模型上为请求的其余部分设置范围

Contacts.scope = { :conditions => {:public => true} } if ladeda 

再后来就

Contacts.all 

应该返回与范围的接触。这只是假装代码,有人知道这是可能的吗?

干杯,

布兰顿

+0

你至少试过了吗?或者你先问? :) – 2009-06-28 22:47:07

+0

我试过后问,因为它看起来像是一个doozie。很高兴看到我可以拿出其他建议没有太多的努力:) – 2009-07-02 05:16:28

这是我会怎么做覆盖:

class Contact < ActiveRecord::Base 
    named_scope :public_only, :conditions => {:public => true} 
end 

class ApplicationController 
    protected 
    def contacts 
    @_contacts ||= ladeda ? Contact.public_only : Contact 
    end 
end 

class ContactsController < ApplicationController 
    def index 
    @contacts = contacts.all 
    end 
end 

我正在决定使用作用域还是不使用辅助方法。另外,您也可以在helper方法移到联系模型本身,比如这个:

class Contact < ActiveRecord::Base 
    def self.for_index 
    ladeda ? self.public_only : self 
    end 
end 

class ContactsController < ApplicationController 
    def index 
    @contacts = Contact.for_index 
    end 
end 

我不认为范围的方法甚至存在。

,使之成为所有后续调用使用

Contacts.default_scope(:conditions => {:public => true}) 

工作,使这少可怕容易出错,也许用一个围绕过滤器,并与

Contact.default_scope(:conditions => "") 
+0

是的,试了这个,我在我的Mac上运行乘客开发,所以我立即就能看到设置类似这样的倒台,因为它仍然是下一个电话!你之后对此不以为然。我猜如果它能被证明工作的很好,那么它会好的,但如果有一天乘客开始多线程会发生什么?可能会有点灾难:) – 2009-07-02 05:03:07

module ContactFilterExtension 

    unloadable 

    def in_context(context) 
    if proxy_owner.context == :special_area && context != :admin 
     scoped(:conditions => {:public => true}) 
    else 
     scoped({}) 
    end 
    end 
end 

然后

class ContactContainer < ActiveRecord::Base 

    unloadable 

    has_many :contacts, :dependent => :destroy, :order => :position, :extend => ContactFilterExtension 

end 

然后控制器:

def index 
    @contacts = @contact_container.contacts.in_context(context) 
    end 

这是简化当然:)这也意味着你可以在这之后链接其他范围,并且还可以从上下文中创建新的记录。非常整齐。

另请注意,有两个背景,一个是我们只能在控制器(其中用户是系统)知道,和另一种是ContactContainer我们可以通过模型单独找到的情况下。

另请注意使用联系人作为示例并非真正的用例:D