在 rails 中按 id 错误访问行记录?
accessing row record by id error in rails?
我创建了三个模型:
recruitment
有很多attendance
project_site
has_many attendance
在出勤视图表#action 中,我正在存储 recruitment_id
、date
和 status
,并在更改时显示标记状态。
但是错误是一旦我标记出勤一个 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: ...)
来确保您为合适的人安排合适的出勤率。
我创建了三个模型:
recruitment
有很多attendance
project_site
has_manyattendance
在出勤视图表#action 中,我正在存储 recruitment_id
、date
和 status
,并在更改时显示标记状态。
但是错误是一旦我标记出勤一个 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: ...)
来确保您为合适的人安排合适的出勤率。