Rails选择:当预先存在的记录不在选择中时

时间:2013-12-18 00:11:58

标签: ruby-on-rails validation select named-scope

我想知道处理这个问题的最佳方法。在我的网站上,我有几个选择框,用户可以将员工与记录相关联。这些选择框被过滤以仅显示活跃的员工。因此,当我们将员工更改为非活动状态,然后尝试编辑记录时会出现问题。

假设我们为Mary Jane创建了一个发票,她是一名活跃的员工。大。

然后我们禁用Mary Jane作为雇员。凉。

稍后我们返回并编辑发票并添加一些注释或其他内容 - 现在好了,因为Mary Jane处于非活动状态,她不会在选择列表中显示为选项。因此,保存发票后,将选中“空白”选项,并将其从发票中删除。即使她现在处于非活动状态,我也不想将她从发票记录中删除。

我正在尝试找到最优雅的方法 - 我可以尝试使用before_save验证,或者我可以创建一个包含所有活跃员工的范围,并以某种方式计算出当前记录是否具有不活跃的员工并包含它?我只是不确定最好的办法。有人遇到过这个问题吗?

1 个答案:

答案 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有一个(可能是非活动的)员工,并且该员工将使用该范围添加到活动员工列表中。

如果有人对如何做到这一点有了更好的了解,我全心全意,但这是我迄今为止找到的最干净的解决方案。