我可以在非嵌套表单中使用_destroy属性吗?

时间:2015-01-27 17:44:33

标签: ruby-on-rails

说我的控制器中有这样的东西:

FacultyMembership.update(params[:faculty_memberships].keys,
                         params[:faculty_memberships].values)

只要_destroy中的params[:faculty_memberships].values键为真,就会销毁记录。

在rails中有这样的东西吗?我意识到还有其他方法可以做到这一点,我只是好奇,如果存在这样的事情。

2 个答案:

答案 0 :(得分:2)

简短回答

没有!

答案很长

仍然没有!它确实适用于nested attributes

  

如果要通过属性销毁关联的模型   hash,你必须首先使用:allow_destroy选项启用它。   现在,当您将_destroy键添加到属性哈希时,使用   如果计算结果为true,则会销毁关联的模型。

但为什么不在控制台中尝试呢?

?> bundle exec rails c
?> m = MyModel.create attr_1: "some_value", attr_2: "some_value"
?> m.update(_destroy: '1') # or _destroy: true
?> ActiveRecord::UnknownAttributeError: unknown attribute '_destroy' for MyModel

这是因为update实现如下:

# File activerecord/lib/active_record/persistence.rb, line 245
def update(attributes)
  # The following transaction covers any possible database side-effects of the
  # attributes assignment. For example, setting the IDs of a child collection.
  with_transaction_returning_status do
    assign_attributes(attributes)
    save
  end
end

assign_attributes的来源是:

# File activerecord/lib/active_record/attribute_assignment.rb, line 23
def assign_attributes(new_attributes)
  if !new_attributes.respond_to?(:stringify_keys)
    raise ArgumentError, "When assigning attributes, you must pass a hash as an argument."
  end
  return if new_attributes.blank?

  attributes                  = new_attributes.stringify_keys
  multi_parameter_attributes  = []
  nested_parameter_attributes = []

  attributes = sanitize_for_mass_assignment(attributes)

  attributes.each do |k, v|
    if k.include?("(")
      multi_parameter_attributes << [ k, v ]
    elsif v.is_a?(Hash)
      nested_parameter_attributes << [ k, v ]
    else
      _assign_attribute(k, v)
    end
  end

  assign_nested_parameter_attributes(nested_parameter_attributes) unless nested_parameter_attributes.empty?
  assign_multiparameter_attributes(multi_parameter_attributes) unless multi_parameter_attributes.empty?
end

答案 1 :(得分:0)

此代码对我有用:

class FacultyMembership < ApplicationRecord
  attr_accessor :_destroy

  def _destroy= value
    self.destroy if value.present?
  end  
end

这可能会破坏嵌套的表格 - 没有检查。