说我的控制器中有这样的东西:
FacultyMembership.update(params[:faculty_memberships].keys,
params[:faculty_memberships].values)
只要_destroy
中的params[:faculty_memberships].values
键为真,就会销毁记录。
在rails中有这样的东西吗?我意识到还有其他方法可以做到这一点,我只是好奇,如果存在这样的事情。
答案 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
这可能会破坏嵌套的表格 - 没有检查。