gpt4 book ai didi

Mysql2::错误: 'sum_hours' 中的未知列 'field list'

转载 作者:行者123 更新时间:2023-11-29 11:32:49 25 4
gpt4 key购买 nike

我开始学习rails,为了在企业中对Redmine的一个插件做一些修改(作为一个学习“生活方式”的学生)已经快2个月了,但是这个问题我在任何地方都找不到解决方案.

让我解释一下:

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

结构是这样的:

| ID | project_id | user_id | issue_id | hours |

此信息是通过此方法构建的:

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

我添加了选择,因为我需要所有列加上总和,并且单独的分组可以很好地工作,但我无法使总和列出现。这是此方法结果的 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 (undefined method `sum_hours' for #)

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

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

嗯,你不能调用不存在的东西......

在 StackOverflow 中寻求帮助的时间为 2°,因此,如果您因为我忘记写而需要更多信息,请这样做:)。

问候和感谢。

编辑:

感谢 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

虽然它只显示一条具有正确总小时数的记录,但是,我尝试按 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

不过,我们不是在当前 project 记录上调用 time_entries 关联,而是选择具有此项目 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

关于Mysql2::错误: 'sum_hours' 中的未知列 'field list',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37116088/

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