Class methods added to DataMapper::Resource to allow it to work with Scaffolding Extensions.
Methods
Public Instance
- scaffold_add_associated_object
- scaffold_all_associations
- scaffold_associated_class
- scaffold_associated_objects
- scaffold_association
- scaffold_association_type
- scaffold_associations
- scaffold_destroy
- scaffold_error_raised
- scaffold_fields
- scaffold_foreign_key
- scaffold_get_object
- scaffold_get_objects
- scaffold_habtm_reflection_options
- scaffold_new_associated_object_values
- scaffold_primary_key
- scaffold_save
- scaffold_table_column_type
- scaffold_table_name
Constants
SCAFFOLD_OPTIONS | = | ::ScaffoldingExtensions::MetaModel::SCAFFOLD_OPTIONS |
Public Instance methods
Add the associated object to the object's association
# File lib/scaffolding_extensions/model/datamapper.rb, line 65 def scaffold_add_associated_object(association, object, associated_object) ap = object.send(association) ap << associated_object unless ap.include?(associated_object) object.save end
Array of all association reflections for this model only shows the associations that are scaffolding_enabled
# File lib/scaffolding_extensions/model/datamapper.rb, line 73 def scaffold_all_associations relationships.values.select { |v| v.send(:target_model).respond_to?(:scaffold_name) } end
The class that this model is associated with via the association
# File lib/scaffolding_extensions/model/datamapper.rb, line 80 def scaffold_associated_class(association) relationships[association].target_model end
All objects that are currently associated with the given object. This method does not check that the returned associated objects meet the associated class's scaffold_session_value constraint, as it is assumed that all objects currently assocated with the given object have already met the criteria. If that is not the case, you should override this method.
# File lib/scaffolding_extensions/model/datamapper.rb, line 149 def scaffold_associated_objects(association, object, options) object.send(association,:order => get_ordering_options(scaffold_select_order_association(association))) end
The association reflection for this association
# File lib/scaffolding_extensions/model/datamapper.rb, line 85 def scaffold_association(association) relationships[association] end
The type of association, either :new for :one_to_many (as you can create new objects associated with the current object), :edit for :many_to_many (since you can edit the list of associated objects), or :one for :many_to_one.
# File lib/scaffolding_extensions/model/datamapper.rb, line 92 def scaffold_association_type(association) if relationships[association].class == DataMapper::Associations::OneToMany::Relationship :new elsif relationships[association].class == DataMapper::Associations::ManyToMany::Relationship :edit else :one end end
List of symbols for associations to display on the scaffolded edit page. Defaults to all associations for which the scaffolding is enabled. Can be set with an instance variable.
# File lib/scaffolding_extensions/model/datamapper.rb, line 104 def scaffold_associations @scaffold_associations ||= relationships.keys.select { |v| relationships[v].send(:target_model).respond_to?(:scaffold_name) }.sort_by{|name| name.to_s} end
Destroys the object
# File lib/scaffolding_extensions/model/datamapper.rb, line 111 def scaffold_destroy(object) object.destroy end
The error to raise, should match other errors raised by the underlying library.
# File lib/scaffolding_extensions/model/datamapper.rb, line 116 def scaffold_error_raised DataMapper::ObjectNotFoundError end
Returns the list of fields to display on the scaffolded forms. Defaults to displaying all columns with the exception of the primary key column. Also includes :many_to_one associations, replacing the foriegn keys with the association itself. Can be set with an instance variable.
# File lib/scaffolding_extensions/model/datamapper.rb, line 124 def scaffold_fields(action = :default) return @scaffold_fields if @scaffold_fields fields = (properties.map {|a| a.name}) - [scaffold_primary_key] scaffold_all_associations.each do |reflection| next unless reflection.class == DataMapper::Associations::ManyToOne::Relationship fields.delete(get_key_array_safe(reflection.send(:child_key)).name) fields.push(reflection.name) end @scaffold_fields = fields.sort_by{|f| f.to_s} end
The foreign key for the given reflection
# File lib/scaffolding_extensions/model/datamapper.rb, line 136 def scaffold_foreign_key(reflection) get_key_array_safe(reflection.child_key).name end
Retrieve a single model object given an id
# File lib/scaffolding_extensions/model/datamapper.rb, line 141 def scaffold_get_object(id) self.get(id) || (raise scaffold_error_raised) end
Retrieve multiple objects given a hash of options
# File lib/scaffolding_extensions/model/datamapper.rb, line 154 def scaffold_get_objects(options) optionshash = {} data = self.all if options[:conditions] conditions = options[:conditions] if conditions && Array === conditions && conditions.length > 0 if String === conditions[0] data = data.all(:conditions => conditions) else conditions.each do |cond| next if cond.nil? data = case cond when Hash, String then data.all(:conditions => [cond.gsub("NULL","?"),nil]) when Array then if cond.length==1 data.all(:conditions => [cond[0].gsub("NULL","?"),nil]) else data.all(:conditions => cond) end when Proc then data.all(&cond) end end end end end slice = nil if options[:limit] startpos = options[:offset] || 0 endpos = options[:limit] slice = [startpos,endpos] end # TODO includes break SQL generation # optionshash[:links] = options[:include] if options[:include] # optionshash[:links] = [optionshash[:links]] unless optionshash[:links].is_a?(Array) if options[:order] then optionshash[:order] = get_ordering_options(options[:order]) end if slice then q = data.all(optionshash).slice(*slice) else q = data.all(optionshash) end #p repository.adapter.send("select_statement",q.query) q.to_a end
Return the class, left foreign key, right foreign key, and join table for this habtm association
# File lib/scaffolding_extensions/model/datamapper.rb, line 201 def scaffold_habtm_reflection_options(association) habtm = relationships[association] [ habtm.target_model, get_key_array_safe(habtm.through.child_key).name, get_key_array_safe(habtm.via.child_key).name, habtm.send(:through_model).storage_name ] end
Returns a hash of values to be used as url parameters on the link to create a new :has_many associated object. Defaults to setting the foreign key field to the record's primary key.
# File lib/scaffolding_extensions/model/datamapper.rb, line 214 def scaffold_new_associated_object_values(association, record) {scaffold_foreign_key(scaffold_association(association))=>record.scaffold_id} end
The primary key for the given table
# File lib/scaffolding_extensions/model/datamapper.rb, line 219 def scaffold_primary_key get_key_array_safe(key).name end
Saves the object.
# File lib/scaffolding_extensions/model/datamapper.rb, line 224 def scaffold_save(action, object) object.save end
The column type for the given table column, or nil if it isn't a table column
# File lib/scaffolding_extensions/model/datamapper.rb, line 229 def scaffold_table_column_type(c) column = self.properties[c] if column then if column.type == DataMapper::Property::Text :text else column.class.to_s.split("::").last.downcase.intern end else nil end end
The name of the underlying table
# File lib/scaffolding_extensions/model/datamapper.rb, line 243 def scaffold_table_name storage_name end