доступ к записи строки по ошибке идентификатора в рельсах? - PullRequest
1 голос
/ 20 июня 2020

Я создал три модели:

  • recruitment has-many attendance

  • project_site has_many attendance

В форме просмотра посещаемости # действие я сохраняю recruitment_id, date и status и показываю отмеченный статус при изменении.

Но ошибка возникает, когда я отмечаю посещаемость на одном recruitment_id, тот же статус отображается для всех recruitment_id, но в бэкэнде сохраняется только отмеченная посещаемость со всеми атрибутами.

Я хочу показать только отмеченный статус всей посещаемости recruitment_id с их соответствующий статус.

форма. 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, но на виду показывает тот же статус во всех столбцах .

введите описание изображения здесь

1 Ответ

2 голосов
/ 20 июня 2020

Каждый раз, когда ваше представление вызывает Attendance.where(attendance_date: ...), оно выполняет запрос SQL для получения списка всех записей посещаемости с указанной датой. Затем вы просто берете первый из списка, который каждый раз будет одним и тем же. (Вы также выполняете запрос дважды - один раз, чтобы проверить пустоту, и еще раз, если она не пуста, что является расточительным).

Вы говорите, что модель набора персонала has_one Посещаемость, поэтому вы должны получить связанная посещаемость человека, просто позвонив по номеру recruitment.attendance, но просто глядя на представление, я подозреваю, что это действительно отношения has_many (или должны быть). В ситуации has_many вы можете по крайней мере использовать recruitment.attendances.find_by(attendance_date: ...), чтобы обеспечить правильную посещаемость для нужного человека.

...