从rails app中的f.select options_for_select中获取值

时间:2016-02-24 23:31:41

标签: ruby-on-rails ruby ruby-on-rails-4

您好我的应用程序中有脚手架,用户可以选择不同类型的纸张并为每种类型添加纸张重量。然后我计算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}}

2 个答案:

答案 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来传递两个参数)还有几种方法可以减少正在运行的查询数量...但这将完成工作。您想要从索引页面上的纸质循环中调用它,但是您最终会这样做。我会以一种方式工作,然后从那里改进它。希望这会有所帮助。