代码之家  ›  专栏  ›  技术社区  ›  craig

将Rails 3范围合并为类方法

  •  3
  • craig  · 技术社区  · 14 年前

    我有4个Rails 3个范围,我想简化:

      scope :age_0, lambda {
        where("available_at IS NULL OR available_at < ?", Date.today + 30.days)
      }
      scope :age_30, lambda {
        where("available_at >= ? AND available_at < ?", Date.today + 30.days, Date.today + 60.days)
      }
      scope :age_60, lambda {
        where("available_at >= ? AND available_at < ?", Date.today + 60.days, Date.today + 90.days)
      }
      scope :age_90, lambda {
        where("available_at >= ?", Date.today + 90.days)
      }
    

    我想到了一个类方法:

    def self.aging(days)
    
      joins(:profile).where("available_at IS NULL OR available_at < ?", Date.today + 30.days) if days==0
      joins(:profile).where("available_at >= ? AND available_at < ?", Date.today + 30.days, Date.today + 60.days) if days==30
      joins(:profile).where("available_at >= ? AND available_at < ?", Date.today + 60.days, Date.today + 90.days) if days==60
      joins(:profile).where("available_at >= ?", Date.today + 90.days) if days==90
    
    end
    

    但我不知道该返回什么来确保它与Rails3范围兼容。

    这是个好方法吗?有更好的方法吗?

    **编辑** 我更新了方法的逻辑。中频测试似乎不像我预期的那样有效。

    2 回复  |  直到 14 年前
        1
  •  6
  •   mscccc Jonas Schubert Erlandsson    11 年前

    向lambda传递参数?

    scope :available_range, lambda { |start|
        where("available_at >= ? AND available_at < ?", start, end+30.days)
    }
    

    另请参见“动态范围构建”这里: http://archives.edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html

        2
  •  3
  •   craig    14 年前

    我需要一个“默认”操作。我添加了“joins(:profile)”。也许有更好的方法,但这是可行的。

    def self.aging(days)
    
      joins(:profile).where("available_at IS NULL OR available_at < ?", Date.today + 30.days) if days==0
      joins(:profile).where("available_at >= ? AND available_at < ?", Date.today + 30.days, Date.today + 60.days) if days==30
      joins(:profile).where("available_at >= ? AND available_at < ?", Date.today + 60.days, Date.today + 90.days) if days==60
      joins(:profile).where("available_at >= ?", Date.today + 90.days) if days==90
      joins(:profile)
    
    end