【问题标题】:Is there a way to create a named scope that groups?有没有办法创建一个分组的命名范围?
【发布时间】:2010-11-04 02:21:38
【问题描述】:

我有以下使用搜索逻辑:

@todos = Todo.contact_user_id_is(current_user).
              contact_campaign_id_is(@campaign).
              current_date_lte(Date.today).
              done_date_null.
              ascend_by_current_date

我只希望@todos 包含单个contact_id 的Todo 记录(contact_id 是Todo 上的一个属性)。

问题:如何进行分组,以便@todos 数组中的每个contact_id 只有一条记录?

【问题讨论】:

    标签: ruby-on-rails arrays group-by named-scope


    【解决方案1】:

    named_scope 支持分组。像这样的东西应该可以工作:

    class Todo < ActiveRecord::Base
    
      belongs_to :contact
    
      named_scope :one_per_contact, lambda{ |user, campaign|
        {
          :joins => :contact,
          :conditions => ['contacts.user_id = ? AND contacts.campaign_id = ? AND todos.current_date <= ? AND todos.done_date IS NULL', user.id, campaign.id, Date.today],
          :group => 'todos.contact_id'
          :order => :current_date
        }
      }
    
    end
    

    然后把它放到你的控制器中:

    @todos = Todo.one_per_contact(current_user, @campaign)
    

    代码可能不完全适合您的应用,但您明白了。

    【讨论】:

    • 让我试试看,我会把结果发给你的……伙计,还在努力理解 lambdas
    • 嗨,我注意到这使用了用户和广告系列的条件——但是 searchlogic 命名范围已经这样做了......所以我仍然需要这些额外的命名范围才能工作?
    • 这个命名范围应该可以在没有任何额外搜索逻辑范围的情况下工作。但是您也可以删除这些条件并改为链接 searchlogic 命名范围。不过,在这种情况下,我会将其全部保存在命名范围内,因为它执行一个非常具体的功能。
    • 嗨,我删除了:conditions,但它似乎并没有将contact_id的数量减少到一个实例......我还删除了lambda,因为我不需要那个函数来做组,对吗?
    • 我最终使用了统计宝石
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多