Ruby on rails ActiveSupport::JSON::Encoding::内容标签中的CircularReferenceError

Ruby on rails ActiveSupport::JSON::Encoding::内容标签中的CircularReferenceError,ruby-on-rails,json,activerecord,serialization,Ruby On Rails,Json,Activerecord,Serialization,我的用户模型具有以下功能: def self.chart_data(start = 1.weeks.ago) total_users = users_by_day(start) (start.to_date..Date.today).map do |date| { created_at: date, users: total_users[date] || 0 } end end def self.users_by_day(start) u

我的用户模型具有以下功能:

def self.chart_data(start = 1.weeks.ago)
  total_users = users_by_day(start)
  (start.to_date..Date.today).map do |date|
    {
      created_at: date,
      users: total_users[date] || 0
    }
  end
end

def self.users_by_day(start)
  users = where(created_at: start.beginning_of_day..Time.zone.now)
  users = users.group("date(created_at), id")
  users = users.select("created_at, count(id) as total_users")
  users.each_with_object({}) do |user, total_users|
    total_users[user.created_at.to_date] = total_users
  end
end
我的观点如下:

<%= content_tag :div, "", id: "users_chart", data: {users: User.chart_data} %>
当我只打印数据时,它看起来如下所示:

[{:created_at=>Wed, 27 Nov 2013, :users=>0}, {:created_at=>Thu, 28 Nov 2013, :users=>0}, {:created_at=>Fri, 29 Nov 2013, :users=>0}, {:created_at=>Sat, 30 Nov 2013, :users=>0}, {:created_at=>Sun, 01 Dec 2013, :users=>0}, {:created_at=>Mon, 02 Dec 2013, :users=>0}, {:created_at=>Tue, 03 Dec 2013, :users=>{Tue, 03 Dec 2013=>{...}}}, {:created_at=>Wed, 04 Dec 2013, :users=>0}]

唯一的用户是12月3日,如果没有用户,也没有错误。

正如您在打印的数据中所注意到的,3日有一个递归引用:

{:created_at=>Tue, 03 Dec 2013, :users=>{Tue, 03 Dec 2013=>{...}}}
这些起源于
users\u by\u day
是如何构建的。通过将给定日期的对象指定给自身,建筑本身具有建筑参照:

users.each_with_object({}) do |user, total_users|
  total_users[user.created_at.to_date] = total_users
end
我认为这只是变量命名中的一个疏忽。您正在创建的聚合对象按块称为
total\u users
,它与您在查询中给它的名称相同。我认为正确的方法是:

 users.each_with_object({}) do |user, total_users|
   total_users[user.created_at.to_date] = user.total_users
 end     

因为您需要从用户变量中获取总计

正如您在打印数据中所注意到的,第3页有一个递归引用:

{:created_at=>Tue, 03 Dec 2013, :users=>{Tue, 03 Dec 2013=>{...}}}
这些起源于
users\u by\u day
是如何构建的。通过将给定日期的对象指定给自身,建筑本身具有建筑参照:

users.each_with_object({}) do |user, total_users|
  total_users[user.created_at.to_date] = total_users
end
我认为这只是变量命名中的一个疏忽。您正在创建的聚合对象按块称为
total\u users
,它与您在查询中给它的名称相同。我认为正确的方法是:

 users.each_with_object({}) do |user, total_users|
   total_users[user.created_at.to_date] = user.total_users
 end     
因为您需要从用户变量中获取总计