module ScaffoldingExtensions::MetaSequel

  1. lib/scaffolding_extensions/model/sequel.rb

Class methods added to Sequel::Model to allow it to work with Scaffolding Extensions.

Constants

SCAFFOLD_OPTIONS = ::ScaffoldingExtensions::MetaModel::SCAFFOLD_OPTIONS  

Public Instance methods

scaffold_add_associated_object (association, object, associated_object)

Add the associated object to the object's association

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 21
def scaffold_add_associated_object(association, object, associated_object)
  object.send(association_reflection(association).add_method, associated_object) unless object.send(association).include?(associated_object)
end
scaffold_all_associations ()

Array of all association reflections for this model

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 26
def scaffold_all_associations
  all_association_reflections
end
scaffold_associated_class (association)

The class that this model is associated with via the association

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 31
def scaffold_associated_class(association)
  association_reflection(association).associated_class
end
scaffold_associated_objects (association, object, options)

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.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 39
def scaffold_associated_objects(association, object, options)
  object.send(association)
end
scaffold_association (association)

The association reflection for this association

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 44
def scaffold_association(association)
  association_reflection(association)
end
scaffold_association_type (association)

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.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 51
def scaffold_association_type(association)
  case (a = scaffold_association(association))[:type]
    when :one_to_many
      a[:one_to_one] ? :one : :new
    when :many_to_many
      :edit
    else
      :one
  end
end
scaffold_associations ()

List of symbols for associations to display on the scaffolded edit page. Defaults to all associations. Can be set with an instance variable.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 64
def scaffold_associations
  @scaffold_associations ||= associations.sort_by{|name| name.to_s}
end
scaffold_destroy (object)

Destroys the object

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 69
def scaffold_destroy(object)
  object.destroy
end
scaffold_error_raised ()

The error to raise, should match other errors raised by the underlying library.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 74
def scaffold_error_raised
  Sequel::Error
end
scaffold_fields (action = :default)

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.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 82
def scaffold_fields(action = :default)
  return @scaffold_fields if @scaffold_fields
  fields = columns - [primary_key]
  all_association_reflections.each do |reflection|
    next unless reflection[:type] == :many_to_one
    fields.delete(reflection[:key].to_sym)
    fields.push(reflection[:name])
  end
  @scaffold_fields = fields.sort_by{|f| f.to_s}
end
scaffold_find_object (*args)

Set *_on_save_failure = false

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 94
def scaffold_find_object(*args)
  obj = super
  obj.raise_on_save_failure = false
  obj.raise_on_typecast_failure = false
  obj
end
scaffold_foreign_key (reflection)

The foreign key for the given reflection

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 102
def scaffold_foreign_key(reflection)
  reflection[:key]
end
scaffold_get_object (id)

Retrieve a single model object given an id

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 107
def scaffold_get_object(id)
  self[id.to_i] || (raise scaffold_error_raised)
end
scaffold_get_objects (options)

Retrieve multiple objects given a hash of options

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 112
def scaffold_get_objects(options)
  records = dataset
  records = records.send(scaffold_use_eager_graph ? :eager_graph : :eager, *options[:include]) if options[:include]
  records = records.order(*options[:order]) if options[:order]
  records = records.limit(options[:limit], options[:offset]) if options[:limit]
  conditions = options[:conditions]
  if conditions && Array === conditions && conditions.length > 0
    if String === conditions[0]
      records = records.filter(*conditions)
    else
      conditions.each do |cond|
        next if cond.nil?
        records = case cond
          when Hash, String then records.filter(cond)
          when Array then records.filter(*cond)
          when Proc then records.filter(&cond)
        end
      end
    end
  end
  records.all
end
scaffold_habtm_reflection_options (association)

Return the class, left foreign key, right foreign key, and join table for this habtm association

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 136
def scaffold_habtm_reflection_options(association)
  reflection = scaffold_association(association)
  [reflection.associated_class, reflection[:left_key], reflection[:right_key], reflection[:join_table]]
end
scaffold_new_associated_object_values (association, record)

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.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 144
def scaffold_new_associated_object_values(association, record)
  {scaffold_foreign_key(association_reflection(association))=>record.pk}
end
scaffold_new_object (*args)

Set *_on_save_failure = false

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 149
def scaffold_new_object(*args)
  obj = super
  obj.raise_on_save_failure = false
  obj.raise_on_typecast_failure = false
  obj
end
scaffold_primary_key ()

The primary key for the given table

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 157
def scaffold_primary_key
  primary_key
end
scaffold_save (action, object)

Saves the object.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 162
def scaffold_save(action, object)
  object.save
end
scaffold_table_column_type (column)

Get the column type from the schema. Sequel doesn't differentiate between string and text columns (since both are the same in ruby), so check if the database type is text or if more than 255 characters allowed in the field and return :text if the type is string.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 170
def scaffold_table_column_type(column)
  if String === column
    return nil unless columns.map{|x| x.to_s}.include?(column)
    column = column.to_sym
  end
  if column_info = db_schema[column] and type = column_info[:type]
    if type == :string && (column_info[:db_type] == "text" || ((mc = column_info[:max_chars]) && mc > 255))
      :text
    else
      type
    end
  end
end
scaffold_table_name ()

The name of the underlying table

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 185
def scaffold_table_name
  table_name
end
scaffold_use_eager_graph ()

Whether to use eager_graph instead of eager for eager loading. This is necessary if you need to reference associated tables when filtering. Can be set with an instance variable.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 192
def scaffold_use_eager_graph
  @scaffold_use_eager_graph ||= false
end
transaction (&block)

Sequel doesn't allow you to use transaction on a model (only on a database), so add a transaction method that starts a transaction on the associated database.

[show source]
# File lib/scaffolding_extensions/model/sequel.rb, line 198
def transaction(&block)
  db.transaction(&block)
end