`

group_by继续上次的to_proc

阅读更多
Assuming recorded_on is a date, and not a DateTime:

@records = Record.all.group_by(&:recorded_on)

If it is a DateTime:

@records = Record.all.group_by { |record| record.recorded_on.to_date }



让我们看下这一切是如何工作的:

class Symbol     
  # Turns the symbol into a simple proc, which is especially useful for enumerations. Examples:     
  #     
  #   # The same as people.collect { |p| p.name }     
  #   people.collect(&:name)     
  #     
  #   # The same as people.select { |p| p.manager? }.collect { |p| p.salary }     
  #   people.select(&:manager?).collect(&:salary)     
  def to_proc     
    Proc.new { |*args| args.shift.__send__(self, *args) }     
  end     
end    


&符号用在symbol前面实际上是调用了to_proc方法,而to_proc里返回一个Proc对象,内部为调用symbol指定的方法。

这个在ruby IRB和Rails Console有区别如下:
这个是不对的,见下面的更正
irb:
[1, 2, 3, 4, 5,6].group_by{|i| i%2}
return a Hash

rails console:
[1, 2, 3, 4, 5,6].group_by{|i| i%2}
return a Array

rails中支持group_by方法,在console里看看其工作原理:

>> a=(1..20).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>> a.group_by{|num| num/5}
=> {0=>[1, 2, 3, 4], 1=>[5, 6, 7, 8, 9], 2=>[10, 11, 12, 13, 14], 3=>[15, 16, 17, 18, 19], 4=>[20]}
>>

通过一个block提出的条件将一个数组转化为一个hash.

hash的key是数组元素执行block之后得到的结果
           value是原数组中执行block得到key的元素组成的数组.

所以,可以在rails中这么用:

譬如根据性别对学生进行分组:
@students=Student.find(:all)
@student_groups=@students.group_by{|s| s.gender}
-
那么现在得到的@student_groups就有两组,一组是male,一组是female.
在对其进行循环的时候,使用hash循环的方式:


<% @student_groups.each do |gender,students| %>
<%= gender %>
<ul>
    <% students.each do |student| %>
        <li><%= student.name%></li>
    <% end %>
</ul>
<% end %>

====结果如下:
female
lucy
jessi
male
jack
jim
mike


hash的循环方式:

2层循环,先对keys进行循环,然后是key对应的values进行循环.
分享到:
评论
4 楼 夜鸣猪 2010-07-21  
orcl_zhang 写道
补充上代码
>> [1, 2, 3, 4, 5,6].group_by{|i| i%2} 
=> #<OrderedHash {0=>[2, 4, 6], 1=>[1, 3, 5]}>

Rails 2.3.2

感谢,确实是
3 楼 夜鸣猪 2010-07-21  
是Hash
>> User.all.group_by{|x|x.id}.class
=> ActiveSupport::OrderedHash

2 楼 orcl_zhang 2010-07-21  
补充上代码
>> [1, 2, 3, 4, 5,6].group_by{|i| i%2} 
=> #<OrderedHash {0=>[2, 4, 6], 1=>[1, 3, 5]}>

Rails 2.3.2
1 楼 orcl_zhang 2010-07-21  
irb:
[1, 2, 3, 4, 5,6].group_by{|i| i%2}
return a Hash

rails console:
[1, 2, 3, 4, 5,6].group_by{|i| i%2}
return a Array
===================
你用的什么环境?
rails console的group_by返回也是一个Hash
  def group_by
    assoc = ActiveSupport::OrderedHash.new

    each do |element|
      key = yield(element)

      if assoc.has_key?(key)
        assoc[key] << element
      else
        assoc[key] = [element]
      end
    end

    assoc
  end unless [].respond_to?(:group_by)

相关推荐

    ping_cap_set_proc报错分析.docx

    Ping 命令报错分析 - cap_set_proc 错误解决方案 Linux 权限控制机制中, capability 是一种基于进程的权限控制机制,它可以将传统的基于用户的权限控制机制进行细粒度的控制。Capability 机制可以控制进程的某些...

    multi_proc_wrong.c

    multi_proc_wrong.c 下载后直接编译运行

    hello_proc.tar.gz_device_create_file_proc_hello

    本主题将深入探讨如何利用proc文件系统创建一个设备文件,具体案例为"hello_proc.tar.gz_device_create_file_proc_hello"。 首先,`/proc`文件系统是一个虚拟文件系统,它并不存储在磁盘上,而是由内核动态生成的,...

    mysql_proc_page_order.zip_page_proc_page_排序MYSQL

    本篇将详细解析标题“mysql_proc_page_order.zip_page_proc_page_排序MYSQL”所涵盖的知识点,以及如何在MySQL中实现翻页与排序的存储过程。 首先,我们需要了解SQL中的`ORDER BY`子句,它是用于对查询结果进行排序...

    Oracle_ProC.rar_linux oracle_linux proc *c_linux proc oracle_ora

    Oracle ProC是Oracle数据库提供的一种集成的C编程接口,它允许开发者使用C语言来编写存储过程、函数、触发器等数据库对象。在Linux环境下,利用ProC开发Oracle应用,可以充分利用C语言的效率和灵活性,同时享受...

    ProC-Sample.rar_oracle_oracle proc sample_proc

    标题中的"ProC-Sample.rar_oracle_oracle proc sample_proc"揭示了这是一个关于Oracle数据库的ProC编程示例。ProC是Oracle提供的一种预编译器,它允许开发者在PL/SQL中嵌入C代码,以提高性能和处理复杂计算。这个...

    flow_proc.rar_flow_proc

    流水线结构是在逻辑很复杂的情况下使用,通过分栈,把一个复杂的逻辑分成若干个比较简单的块实现,减少信号的逻辑级,提高频率。最形象的实例就是位宽较大的加法器。 把一个复杂的逻辑分成若干个比较简单的块实现,...

    multi_proc.c

    multi_proc.c 下载后直接编译运行

    PROC_BLE_Datasheet

    ### PROC_BLE 数据手册知识点 #### 一、概述 **PROC_BLE**是Cypress公司推出的一款高性能蓝牙低功耗(Bluetooth Low Energy,简称BLE)解决方案,适用于多种应用领域,包括人机交互设备(HID)、遥控器、玩具、信...

    matlab导入excel代码-utl_why_proc_import_export_needs_to_be_deprecated_and_d

    matlab导入excel代码utl_why_proc_import_export_needs_to_be_deprecated_and_dosubl_acknowledged 为什么不赞成proc import导出并确认dosubl。 关键字:sas sql join合并大数据分析宏oracle teradata mysql sas社区...

    kernel_module_list_first_proc-_level.c.gz_kernel list

    kernel_module_list_first_proc _level

    Linux_kernel_proc.rar_linux memory proc

    在Linux操作系统中,`/proc`目录是一个非常特殊且重要的虚拟文件系统,它提供了一种方式来查看和交互内核的状态。标题中的“Linux_kernel_proc.rar_linux memory proc”表明我们将探讨如何通过`/proc`来理解和分析...

    SAS]proc_Template_Styles_Tip_Sheet.pdf

    在给定文件信息中,我们可以识别出关于SAS的proc_template过程以及样式模板定义的关键知识点。SAS(Statistical Analysis System)是一种强大的数据分析系统,广泛应用于统计分析、商业智能等领域。proc_template是...

    All_Procedure_NO_Modify_3__PROC_BOM_PRICE_REFRESH.sql

    标题 "All_Procedure_NO_Modify_3__PROC_BOM_PRICE_REFRESH.sql" 暗示我们正在处理一个SQL脚本文件,可能是一个存储过程或者数据库维护脚本,用于更新BOM(Bill of Materials)价格信息。BOM是产品结构的详细清单,...

    sem_proc_consume.rar_consume

    "sem_proc_consume.rar_consume" 提供的是一段简单的C语言代码示例,旨在帮助学习者理解如何在实际编程中应用信号量进行资源消耗或生产的管理。下面我们将深入探讨信号量的概念、类型以及如何在C语言中使用它们。 1...

    proc_control.c

    父进程创建多个子进程分别执行的代码

    proc_mm.rar_procmm

    在Linux系统中,`proc_mm`是一个非常关键的内核组件,它主要处理与进程内存管理相关的操作。本文将深入探讨`proc_mm`及其在嵌入式Linux中的应用,特别是结合给定的文件`asymmetric_type.c`和`proc_mm.h`来分析其涉及...

    Win_proc_list_2.rar_ring0_ring0 c++_visual c

    标题中的"Win_proc_list_2.rar"暗示这是一个与Windows操作系统相关的项目或代码示例,而"ring0"和"ring0_c++"则表明这个项目是关于在Ring 0级别进行编程的,Ring 0是操作系统的最核心层,通常用于设备驱动程序和操作...

Global site tag (gtag.js) - Google Analytics