您好我的应用程序中有脚手架,用户可以选择不同类型的纸张并为每种类型添加纸张重量。然后我计算ApplicationController中每个用户的paper_weight运行总数。
我希望更具体,并向用户显示他们正在使用的每种paper_type的平均权重。我有点失落,因为我对铁杆很陌生,这里的任何人都可以帮助我吗?
提前致谢
以下是我的观点。
in paper / new.html.erb
@paper_weight_per_capita = current_user.papers.sum(:paper_weight) / (current_user.profile.staff)
ApplicationController.rb中的
{{1}}
答案 0 :(得分:1)
首先是调整。
在Paper
类中,您要为纸张类型放置可接受值的数组。这样,您可以在将来验证来自可能不仅仅是此表单的输入。它还允许您测试该代码,并在视图中放置一个数组,这不是最好的做法。
class Paper
PAPER_TYPES = ['Skrifstofupappír', 'Dagblaðapappír', 'Glans_&_tímaritapappír', 'Annað']
...
然后在您看来,改为此。
<%= f.select(:paper_type, options_for_select(Paper::PAPER_TYPES)) %>
这不能回答你的问题,只是通过调整来使你的代码更清晰,更可测试。
然后在您的User
模型中
def average_paper_types
self.papers.group(:paper_type).sum(:paper_weight)
end
在你的部分:
<table>
<thead>
<tr>
<% current_user.average_paper_types.each do |pair| %>
<th><%= pair[0] %></th>
<% end %>
</tr>
</thead>
<tbody>
<tr>
<% current_user.average_paper_types.each do |pair| %>
<td><%= pair[1] %></td>
<% end %>
</tr>
</tbody>
</table>
答案 1 :(得分:0)
不正确我理解正确,但我认为您尝试做的事情(基于评论)是在索引页面上显示每种纸张类型的平均值。
当您重复浏览属于该用户的不同类型的论文时,您可以调用执行该计算的方法。在这种方法中你可能会做这样的事情:
def paper_weight_by_type(user_id, paper_type)
u = User.find(user_id)
weight_by_type = Paper.where(user_id: user_id, paper_type: paper_type).pluck(:paper_weight)
# then return this
weight_by_type.inject(:+)
end
这是一个原始版本。这可能是用户或纸张上的实例方法,在这种情况下,您不需要两个参数。 (即current_user.paper_weight_by_type(paper_type)...也可以使它成为一个类方法,并通过在def前面添加self来传递两个参数)还有几种方法可以减少正在运行的查询数量...但这将完成工作。您想要从索引页面上的纸质循环中调用它,但是您最终会这样做。我会以一种方式工作,然后从那里改进它。希望这会有所帮助。