自从我开始学习在企业中对Redmine插件进行一些修改(作为学生学习“生活”方式的学生)以来,已经有将近2个月的时间,但是这个问题是我无法在任何地方找到解决方案的。

让我解释:

我需要按user_id和project_id对大量的时间条目进行分组(这没有问题),但是如果我这样做,则需要对这些组中的时间进行总计。

estructure是这样的:


  | ID | project_id | user_id | issue_id |小时


并且此信息是通过以下方法建立的:

def time_entries_for_user(user, options={})
    extra_conditions = options.delete(:conditions)
    return TimeEntry.select('*,sum(hours) as sum_hours').
      includes(self.includes).
      where(self.conditions([user], extra_conditions)).
      group('issue_id, time_entries.project_id').
      order('issues.id ASC')
end


我添加了select,因为我需要所有列以及总和一,而group by仅凭其效果很好,但是我无法使Sum列出现。
这是此方法结果的json代码:

{"test1 / SubProyectoTest1":{"logs":[{"id":24,"project_id":4,"user_id":1,"issue_id":10,"hours":6.0,"comments":"","activity_id":8,"spent_on":"2016-05-03","tyear":2016,"tmonth":5,"tweek":18,"created_on":"2016-05-03T11:07:09.000Z","updated_on":"2016-05-03T11:07:09.000Z","sum_hours":9.0}],"users":[{"id":1,.....


有趣的是,在按项目分组的其他方法中,Sum列出现。
这个很好用:

def time_entries_for_all_users(project)
    return project.time_entries.select('*,sum(hours) as sum_hours').
    includes(self.includes).
    where(self.conditions(self.users)).
    group('issue_id,user_id')
      order('issues.id ASC')
    end


{"test1 / SubProyectoTest1":{"logs":[{"id":24,"project_id":4,"user_id":1,"issue_id":10,"hours":6.0,"comments":"","activity_id":8,"spent_on":"2016-05-03","tyear":2016,"tmonth":5,"tweek":18,"created_on":"2016-05-03T11:07:09.000Z","updated_on":"2016-05-03T11:07:09.000Z","sum_hours":9.0}],"users":[{"id":1.......


在日志中,此错误显示:


  ActionView :: Template :: Error(#的未定义方法“ sum_hours”)


在呈现时间条目的视图上引用此代码:

 <% when l(:field_hours) %>
<strong><%= number_with_precision(time_entry.sum_hours, :precision => @precision) %></strong>


好吧,你不能叫不存在的东西...

2º时间在StackOverflow上寻求帮助,所以如果您需要更多信息,因为我忘了写它,请这样做:)。

问候和感谢。

编辑:

多亏了BoraMa和Emiliano,我可以手动添加关系。
第一个示例的代码更改为:

    def time_entries_for_user(user, options={})
        extra_conditions = options.delete(:conditions)

        return TimeEntry.select('*,sum(hours) as sum_hours').
              includes(self.includes).
              where(self.conditions([user], extra_conditions)).
              where("time_entries.user_id",user)
              group('issue_id, time_entries.project_id').
              order('issues.id ASC')
          end
   end


尽管它只显示一个带有适当小时数的记录,但是,im试图按issue_id分组,并按user_id分组,导致仅显示1条记录。

编辑2:
最后!!我没有意识到方法的顺序会改变结果:/。最终代码:

  def time_entries_for_user(user, options={})
    extra_conditions = options.delete(:conditions)

    return TimeEntry.group('time_entries.project_id,time_entries.issue_id').
      select('*,sum(hours) as sum_hours').
      includes(self.includes).
      where(self.conditions([user], extra_conditions)).
      where("time_entries.user_id",user)
      order('issues.id ASC')
  end


感谢大伙们!

最佳答案

在我的测试中,按照第一个示例-sum_hours方法,在模型上执行查询时,通常可以将手动选择的列(在您的情况下为time_entries_for_user)作为“虚拟”属性进行访问。

但是,如果您尝试将自定义选择添加到记录的关联,它似乎不起作用。然后,我得到与您完全相同的错误(NoMethodError)。为此,我建议您将第二个查询(time_entries_for_all_users)重写为不使用关联的表单,即类似以下形式的表单:

def time_entries_for_all_users(project)
  TimeEntry.select('*,sum(hours) as sum_hours').     # <- no association used here
      includes(self.includes).
      where(self.conditions(self.users)).
      where("time_entries.project_id", project.id).  # <- the assoc. is added here instead
      group('issue_id,user_id')
      order('issues.id ASC')
end


除此之外,我们没有选择当前time_entries记录上的project关联,而是选择了具有该项目ID的所有时间条目。这应返回与原始查询相同的记录,但自定义列也应正常工作。您可能需要进一步更新查询,以便您的其他条件(包括条件)也可以正常工作。

作为第二个选项,您始终可以定义关联以及手动选择:

has_many :time_entries_with_hours_sum,
         -> { select("time_entries.*, sum(hours) as sum_hours") }, class_name: "TimeEntry"


然后,您的自定义列通常应该可以使用此新关联进行访问:

project.time_entries_with_hours_sum.first.sum_hours
# => 9.0

关于mysql - Mysql2::Error:“字段列表”中的未知列“sum_hours”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37116088/

10-11 11:35