在 rails 中按 id 错误访问行记录?

accessing row record by id error in rails?

我创建了三个模型:

在出勤视图表#action 中,我正在存储 recruitment_iddatestatus,并在更改时显示标记状态。

但是错误是一旦我标记出勤一个 recruitment_id 相同的状态会显示给所有 recruitment_id 但在后端它只存储标记出勤的所有属性。

我只想显示 recruitment_id 所有出勤的标记状态及其相应的状态。

form.html.erb

    <table>
      <thead>
        <tr>
          <th class="attendance-emp-name">Emp. Name</th>

          <% (1..(Time.days_in_month @project_site.attendance_month.strftime("%m").to_i)).each do |date| %>
                <th class="text-center"><%= date %></th>
          <% end %>

        </tr>
      </thead>

      <tbody>
        <% @recruitment.where(location: @project_site.site_id).each do |recruitment| %>
          <tr>
              <td class="attendance-emp-name"><%= recruitment.name %></td>

              <% (1..(Time.days_in_month @project_site.attendance_month.strftime("%m").to_i)).each do |date| %>
                    <td>


                      <%= form_with(model: attendance, :html => {:id => 'attendance-form-validation'}, url:[@project_site, @attendance], local: true) do |f| %>

                        <% if attendance.errors.any? %>
                          <div id="error_explanation">
                            <h2><%= pluralize(attendance.errors.count, "error") %> prohibited this attendance from being saved:</h2>

                            <ul>
                            <% attendance.errors.full_messages.each do |message| %>
                              <li><%= message %></li>
                            <% end %>
                            </ul>
                          </div>
                        <% end %>


                        <div>

                          <% if Attendance.where(attendance_date: (@project_site.attendance_month.strftime("%Y-%m")+"-"+date.to_s)).first == nil %>
                          <div class="wrapper-class">
                            <%= f.select :status, [['P', 1], ['A', 2], ['H', 3], ['L', 4], ['WE', 5], ['CO', 6]], {}, { onchange: 'this.form.submit()', class: 'attendance-select-input' } %>
                          </div>
                          <% else%>
                            <% attendance_value =  Attendance.where(attendance_date: (@project_site.attendance_month.strftime("%Y-%m")+"-"+date.to_s)).first.status %>
                              <%if attendance_value == 1 %>
                                <%="P" %>
                              <% elsif attendance_value == 2 %>
                                <%="A"%>
                              <%elsif attendance_value == 3 %>
                                <%="H"%>
                              <%elsif attendance_value == 4 %>
                                <%= "L" %>
                              <%elsif attendance_value == 5 %>
                                <%= "WE" %>
                              <%elsif attendance_value == 6 %>
                                <%= "CO" %>
                              <% end %>
                          <% end %>

                            <%= f.hidden_field :attendance_date, value: (@project_site.attendance_month.strftime("%Y-%m")+"-"+date.to_s)%>
                            <%=f.hidden_field :recruitment_id, value: recruitment.id%>
                            <%=f.hidden_field :project_site_id, value: @project_site.id%>
                            </div>

                            <div>
                              <%# f.submit 'Submit', :class => 'button primary small float-right' %>
                            </div>

                      <% end %>
                    </td>
              <% end %>

          </tr>
        <% end %>
      </tbody>
    </table>

一旦我标记了一名员工的出勤,它就会在数据库中使用 recruitment_id 正确存储,但在视图中它在所有列中显示相同的状态。

每次您的视图调用 Attendance.where(attendance_date: ...) 时,它都会执行 SQL 查询以提取具有指定日期的所有出勤记录的列表。然后你只是从列表中抓取第一个,每次都是相同的。 (您还执行了两次查询——一次检查是否为空,如果不为空则再次检查,这很浪费)。

你说招聘模型 has_one 出勤率,所以你应该通过调用 recruitment.attendance 来获取此人的相关出勤率,但只看视图我怀疑它真的是 has_many 关系(或应该是)。在 has_many 的情况下,您至少可以使用 recruitment.attendances.find_by(attendance_date: ...) 来确保您为合适的人安排合适的出勤率。