在模型上为请求的其余部分设置范围
我想知道是否有办法在模型类上为请求的其余部分设置范围?即我想要缩小一些结果的范围,但是我想在没有主要的宁静控制器知道的情况下这样做(可能在注入控制器的before_filter中)。在模型上为请求的其余部分设置范围
Contacts.scope = { :conditions => {:public => true} } if ladeda
再后来就
Contacts.all
应该返回与范围的接触。这只是假装代码,有人知道这是可能的吗?
干杯,
布兰顿
这是我会怎么做覆盖:
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 => "")
是的,试了这个,我在我的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
你至少试过了吗?或者你先问? :) – 2009-06-28 22:47:07
我试过后问,因为它看起来像是一个doozie。很高兴看到我可以拿出其他建议没有太多的努力:) – 2009-07-02 05:16:28