自从我开始学习在企业中对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/