gpt4 book ai didi

ruby-on-rails - Rails - group_by

转载 作者:行者123 更新时间:2023-12-02 19:39:05 24 4
gpt4 key购买 nike

我的应用程序有一些报告,我正在尝试为所有这些集合的 group_by 制作一个辅助方法。

示例:

def group_collection(collection, options = {})
column = options[:column]
group_count = collection.group_by{ |item| item.column.strftime('%b %y')}
end

这就是我打算使用它的方式

@user_groups = group_collection(@users, :column => "created_at")

不幸的是,这不起作用。

undefined method `column' for... [CollectionObject]

有关如何在运行时使“column”变量成为实际列类型以便将自己视为 activerecord 列而不是实例方法的任何线索?

最佳答案

忽略代码中的一些其他问题,您试图用column做什么可以这样做:

collection.group_by { |item| item.send(column).strftime('%b %y') }

这是可行的,因为在 Ruby 中,访问实例变量的方式是通过访问器方法,通常以您要访问的变量命名,因此 @item.foobar调用foobar方法@item

现在,回到那些“其他问题”。尝试将重复的行为转移到一个地方是件好事,并且当您为了灵活而让事情变得不那么明确时,这表明您正在考虑可扩展性。然而,有一些事情对你来说不太好,我觉得有必要指出。

  1. 分组适用于许多数据类型,其中大多数不响应 strftime 。通过对它的调用进行硬编码,您将引入意外行为,这意味着您无法运行 group_collection(@users, :column => 'phone_number') 。相反,只有在测试列数据可以响应它之后才运行它。

    collection.group_by do |item|
    data = item.send(column)
    data.respond_to?(:strftime) ? data.strftime('%b %y') : data
    end
  2. 如果您确定此辅助方法的行为是在任意列上进行分组,则您可以放弃接受选项哈希的额外复杂性,而只是为了规避它。

    def group_by_column(collection, column)
    collection.group_by { ... }
    end
    group_by_column(@users, :column)
  3. 如果您使用的是 Ruby 1.9+ 并且不需要进行任何额外的格式化,您可以更轻松地按任意列进行分组。

    @users.group_by &:created_at

关于ruby-on-rails - Rails - group_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4949164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com