/AppceleratorRecord

This project exists in an effort to make it as simple as possible to create models in Appcelerator much like ActiveRecord does for Rails without having to duplicate basic finders and CRUD operations.

Primary LanguageJavaScriptOtherNOASSERTION

AppceleratorRecord

(ActiveRecord for Appcelerator)

This project exists in an effort to make it as simple as possible to create models in Appcelerator much like ActiveRecord does for Rails without having to duplicate basic finders and CRUD operations.

Any help on this project would be appreciated.

Includes

I use this as a global include file which gets added to each page (THIS IS AN EXAMPLE)

var pathToRoot = '../';

var files = [
  // helper files
  'AppceleratorRecord/prototype_extensions.js',
  'AppceleratorRecord/array.js',
  'helpers/application.js', // this file doesn't exist, this is an example of another file you could have

  //models
  'AppceleratorRecord/appcelerator_database.js',
  'AppceleratorRecord/appcelerator_record.js',
  'models/order.js'
];

for(var i=0; i<files.length; i++){ Ti.include(pathToRoot + files[i]); }

Usage

In app.js call your models once to create the database and tables

var models = [new Order(), new OtherModel()];
models.each(function(model){ model.init(); }); //run init() once! inside of app.js to create the table, columns and indexes

A new model would look like

//only need to include these once, preferably in a global includes file
Titanium.include('helpers/prototype_extensions.js');
Titanium.include('helpers/array.js');
Titanium.include('appcelerator_database.js');
Titanium.include('appcelerator_record.js');

var Order = function() {
  this.klass = 'Order';
  this.tableName = 'orders';
  this.databaseName = 'mydatabase';
  this.createSQL = "(id integer PRIMARY KEY AUTOINCREMENT DEFAULT NULL, uuid Varchar, name Varchar, placed_at Timestamp)"; //just the columns are needed
  this.indexes = [
    ['user_id', 'item_id'']
  ];
  this.migrations = [
    ['resource_type', 'varchar'] // Added after release, Nov 4th 2010
  ]; //columns that didn't make it into the initial release.  Use this if your app has already been deployed to production.

  var ar = new AppceleratorRecord({databaseName: this.databaseName, tableName: this.tableName, createSQL: this.createSQL, indexes: this.indexes, migrations: this.migrations });
  this.merge(ar);
  this.addLocalMethods(this);

  this.orderExists = function(){
    // custom code here
  };

  return this;
};

We now have full CRUD on a new Order object.

CRUD

var o = new Order();
o.name = "Test Order";
o.save(); //create
o.id // would return the new objects id.
o.name = "Updated Name";
o.save(); // update
o.update('name', 'my updated value'); //update single column
o.destroy(); // destroy

Finders

new Order().all();
new Order().find(id);
new Order().findBy('name', 'Test Order');
new Order().findAllBy('name', 'Test Order'); // array
new Order().findAllBy(['name', 'user_id'], ['Test Order', 1]); // accepts multiple conditions
new Order().findBy('uuid', 'IS NULL'); //find by null/is not null
new Order().first();
new Order().last();
new Order().count();
new Order().count(['name', 'user_id'], ['Test Order', 1]); // accepts multiple conditions
new Order().findOrCreateBy(['name'], ['myValue']); // find or create new object

Destroyers

new Order().destroyAll();
new Order().destroyAll(['user_id'], [123]); //uses findAllBy()

Callbacks

this.destroyCallback = function(){}; // runs after a destroy is called

Indexes

See above in the Usage

Migrations

See above in the Usage

Database Logging

You can set a global variable to enable database logging which will print all SQL calls to the Titanium Developer console

var AppceleratorRecordConfig = { logging: false }; // enable Database Logging

To Do

new Order.sum('columnName');