2009-06-27 41 views
2

哇疯狂的标题!但这是问题。在努力干燥我的学校网站管理系统应用程序时,我已经将我的应用程序(FileSet)模块放在一个位置,并将其放置在一个位置。以前FileSet用于通用网站系统,也用于儿童学习区域系统。除了一个细微差别之外,他们的表现完全一样。在儿童区域,FileSet文件分为启动和正常两类。启动文件是教师制作的文件,普通文件是孩子们制作的文件。现在在一般的网站应用程序中,这个区别是不相关的,因此被忽略。这是艰难的部分。我想在这两种情况下使用相同的控制器和视图。在运行时,我知道一个文件集属于一般站点,或属于这个学习区域,所以我可以说,如果它在学习区域上下文中,我想限制FileSet.find(x).files只使用'正常'命名范围。如果上下文是普通网站,那么我们根本就不会使用命名范围。根据运行时环境约束查找条件

我简化了上面的信息,但基本上问题是,如何调用FileSet.find(x).files并使文件方法足够聪明以缩小基于运行时上下文返回的结果?

我已经探索了关联扩展了一下,但似乎没有做这项工作。我希望这里存在一些东西。我试图拼命地在模型中保留这个逻辑,而没有关注它的视图或控制器。默认范围将工作一种享受,如果他们在运行时:)

期待一些建议:)

干杯评估,

布兰顿

回答

2

你可以使用一个名为范围以一个PROC是确定当前上下文并返回适当的条件? 像这样的文件:

named_scope :for_context, :conditions => lambda { 
    if only_normal? 
    { :type => 'normal' } 
    elsif only_startup? 
    { :type => 'normal' } 
    else 
    {} 
    end 
} 

,那么你可以拨打:

FileSet.find(x).files.for_context 
+0

感谢亚瑟,那很可能必须的方式。我刚刚意识到我还需要根据控制器条件进行过滤(无论用户是否在管理员区域),因此我必须调用范围并通过当前上下文:)感谢您的建议: ) – 2009-06-28 09:43:31