【问题标题】:Dynamic `named_scope` depending on certain criterias取决于某些标准的动态`named_scope`
【发布时间】:2011-03-10 06:15:53
【问题描述】:

亲爱的,我有一个 Student 模型,我在其中指定了一些 name_scope,例如from_program、from_year、from_school、has_status、from_course等……

我是否可以在运行时根据某些标准动态地将不同的named_scope 链接在一起?

例如,如果访问数据的用户来自 Finance,我希望能够仅将 from_school 和 has_status 链接在一起。如果用户是讲师,我希望能够将from_course、from_school 链接在一起,等等...

我应该使用named_scope 吗?还是我应该回到指定条件的旧方法?

提前感谢您的建议! =) 顺便说一句,我正在使用 rails 2.3

【问题讨论】:

    标签: ruby-on-rails named-scope


    【解决方案1】:

    我不确定,如果我理解了,但我认为你可以这样做:

    class Student
    
      named_scope from_program, lambda{|program| :conditions => {:program => program}}
      named_scope from_year, lambda{|year| :conditions => {:year => year}}
      named_scope has_status, lambda{|status| :conditions => {:status => status}}
    
      def self.from_finance(school, status)
        self.from_school(school).has_status(status)
      end
    
    end
    

    或更笼统的

    def self.get_students(params)
      scope = self
      [:program, :year, :school, :course].each do |s|
        scope = scope.send("from_#{s}", params[s]) if params[s].present?
      end
      scope = scope.has_status(params[:status]) if params[:status].present?
      scope
    end
    

    【讨论】:

    • 是的,您得到了我需要实现的目标,但是您的一般情况没有得到结果,因为当您执行send 时,named_scope 会立即运行,因此它不会链接所有 named_scopes一起=(我尽量避免第一种方法,因为标准可以变得非常好,因为他们可以根据允许的范围指定他们希望检索的学生群体...... =(但感谢您的建议,非常关闭!
    • 不客气! ;] 关于一般方法:我已经对其进行了测试,对于组合命名范围(通过名称或发送添加)它仍然可以,只产生 1 个查询...我有一个应用程序,我使用了这种方法,如果我这样做在控制台 Order.send(:edited).send(:by_code, 3) 我得到 Order Load (0.3ms) SELECT * FROM orders WHERE ((code LIKE '%3% ') AND (orders.status = 'edition'))
    • 我试过用这种方式运行,但它没有返回任何结果,它只是返回 Student 类本身......
    【解决方案2】:

    你可以试试这样的

    类用户扩展 ActiveRecord::Base 所属:学期 命名范围:年,lambda { |*年| 如果 year.empty? || year.first.nil? { :joins => :semester, :conditions => ["year = #{CURRENT_SEMESTER}"]} 别的 { :joins => :semester, :conditions => ["year = #{year}"]} 结尾 } 结尾

    你可以这样调用

    User.year # 默认为 CURRENT_SEMESTER 常量 User.year() # 同上 User.year(nil) # 同上;如果传递一个可能存在也可能不存在的参数值,即 param[:year] 用户年(2010)

    同样可以传递参数

    【讨论】:

    • 这不是我实际要求的...但感谢您的建议
    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多