【问题标题】:Constricting find conditions based upon runtime contexts根据运行时上下文限制查​​找条件
【发布时间】:2009-06-27 11:10:34
【问题描述】:

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

我已经简化了上面的信息,但基本上问题是,我怎样才能调用 FileSet.find(x).files 并让 files 方法足够聪明以根据运行时上下文缩小返回的结果?

我对关联扩展进行了一些探索,但这似乎并没有起到作用。我希望这里有一些东西。我正在拼命地尝试将这个逻辑保留在模型中,而不是让视图或控制器与之相关。如果在运行时对默认范围进行评估,则默认范围将起作用:)

期待一些建议:)

干杯,

布兰登

【问题讨论】:

    标签: ruby-on-rails activerecord scope


    【解决方案1】:

    您能否将命名范围与确定当前上下文并返回适当条件的过程一起使用? 文件中的类似内容:

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

    然后你可以打电话:

    FileSet.find(x).files.for_context
    

    【讨论】:

    • 谢谢亚瑟,这可能就是这样。我刚刚意识到我还需要根据控制器条件(无论用户是否在管理区域)进行过滤,所以我必须调用一个范围并通过当前上下文 :) 感谢您的建议: )
    猜你喜欢
    • 2013-11-21
    • 2011-06-18
    • 1970-01-01
    • 2014-11-13
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多