我想知道处理这个问题的最佳方法。在我的网站上,我有几个选择框,用户可以将员工与记录相关联。这些选择框被过滤以仅显示活跃的员工。因此,当我们将员工更改为非活动状态,然后尝试编辑记录时会出现问题。
假设我们为Mary Jane创建了一个发票,她是一名活跃的员工。大。
然后我们禁用Mary Jane作为雇员。凉。
稍后我们返回并编辑发票并添加一些注释或其他内容 - 现在好了,因为Mary Jane处于非活动状态,她不会在选择列表中显示为选项。因此,保存发票后,将选中“空白”选项,并将其从发票中删除。即使她现在处于非活动状态,我也不想将她从发票记录中删除。
我正在尝试找到最优雅的方法 - 我可以尝试使用before_save验证,或者我可以创建一个包含所有活跃员工的范围,并以某种方式计算出当前记录是否具有不活跃的员工并包含它?我只是不确定最好的办法。有人遇到过这个问题吗?
答案 0 :(得分:0)
我将回答我是如何使用范围解决这个问题的,因为其他用户已经请求了这个。继续上面的例子,我们假设我们有Invoice和Employee模型:
class Invoice < ActiveRecord::Base
belongs_to :employee
end
class Employee < ActiveRecord::Base
has_many :invoices
# the select_menu scope takes an employee instance as an argument
# and adds this employee to the list of 'active' employees
scope :active, where(active: true)
scope :select_menu, lambda { |another_employee| active << another_employee }
end
然后,在您的视图/表单中,使用select_menu范围并传入当前(非活动)员工以将其添加到下拉列表中:
/views/invoices/_form.html.erb
<%= simple_form_for @invoice do |f| %>
<%= f.association :employee, collection: Employee.select_menu(@invoice.employee).sort_by(&:name), label_method: :first_last, include_blank: "" %>
...
<% end %>
因此,假设此表单在新视图和编辑视图中正常使用 - 当调用新操作时,员工不会链接,只有活动员工会显示在下拉列表中。当调用编辑操作时,@ innoice有一个(可能是非活动的)员工,并且该员工将使用该范围添加到活动员工列表中。
如果有人对如何做到这一点有了更好的了解,我全心全意,但这是我迄今为止找到的最干净的解决方案。