module DSNode::DSResource::ClassMethods
Public Instance Methods
belongs_to_many_ds_resources(name, options = {})
click to toggle source
# File lib/ds_node/ds_resource.rb, line 109 def belongs_to_many_ds_resources name, options = {} single_name = options.key?(:single_name) ? options.delete(:single_name) : name.to_s.singularize.to_sym prevent_destroy_last = options.key?(:prevent_destroy_last) ? options.delete(:prevent_destroy_last) : false belongs_to_many name, options.reverse_merge({ class_name: "DSNode::Resource", }) attr_accessor :"new_#{single_name}_files" attr_accessor :"destroy_#{single_name}_ids" attr_accessor :"remove_#{single_name}_ids" before_save do if send(:"new_#{single_name}_files").present? new_resources = Array(send(:"new_#{single_name}_files")).map do |file| DSNode::Resource.create! file: file end send :"#{name}=", send(name) + new_resources send :"new_#{single_name}_files=", nil end end before_save do if send(:"destroy_#{single_name}_ids").present? (send(:"destroy_#{single_name}_ids") || []).map(&:to_i).each do |id| send :"#{single_name}_ids=", send(:"#{single_name}_ids") - [id] raise PreventDestroyLast if prevent_destroy_last && send(name).count == 1 DSNode::Resource.destroy(id) end send :"destroy_#{single_name}_ids=", nil end end before_save do if send(:"remove_#{single_name}_ids").present? (send(:"remove_#{single_name}_ids") || []).map(&:to_i).each do |id| send :"#{single_name}_ids=", send(:"#{single_name}_ids") - [id] raise PreventDestroyLast if prevent_destroy_last && send(name).count == 0 end send :"remove_#{single_name}_ids=", nil end end end
ds_resource(name, options = {})
click to toggle source
# File lib/ds_node/ds_resource.rb, line 30 def ds_resource name, options = {} should_validate = options.fetch(:validate, true) belongs_to name, options.reverse_merge({ class_name: "DSNode::Resource", required: false, }) inquirer_accessor = :"#{name}?" define_method inquirer_accessor do send(name).present? end writer_accessor = :"#{name}_file" attr_accessor writer_accessor validates writer_accessor, recognized_file_type: true if should_validate destroy_accessor = :"destroy_#{name}" attr_accessor destroy_accessor remove_accessor = :"remove_#{name}" attr_accessor remove_accessor after_save do if file = send(writer_accessor) send :"build_#{name}", file: file send :"#{writer_accessor}=", nil save end end after_save do if send(destroy_accessor).to_i == 1 send(name).try(:destroy) send :"#{name}=", nil send :"#{destroy_accessor}=", nil save end end after_save do if send(remove_accessor).to_i == 1 send :"#{name}=", nil send :"#{remove_accessor}=", nil save end end end
has_many_ds_resources(name, options = {})
click to toggle source
# File lib/ds_node/ds_resource.rb, line 79 def has_many_ds_resources name, options = {} single_name = options.key?(:single_name) ? options.delete(:single_name) : name.to_s.singularize.to_sym prevent_destroy_last = options.key?(:prevent_destroy_last) ? options.delete(:prevent_destroy_last) : false has_many name, options validates :"new_#{single_name}_files", recognized_file_type: true attr_accessor :"new_#{single_name}_files", :"destroy_#{single_name}_ids" after_save do if send(:"new_#{single_name}_files").present? Array(send(:"new_#{single_name}_files")).each do |file| send(name).create! file: file end send :"new_#{single_name}_files=", nil end end after_save do if send(:"destroy_#{single_name}_ids").present? (send(:"destroy_#{single_name}_ids") || []).each do |id| raise PreventDestroyLast if prevent_destroy_last && send(name).count == 1 send(name).destroy(id) end send :"destroy_#{single_name}_ids=", nil end end end