salesforce-orm
Active record like ORM for Salesforce
Setup
Add gem to your Gemfile
gem 'salesforce-orm'
Or, If you want to install globally
gem install salesforce-orm
This Gem internally use Restforce, So you have to configure it
There are 2 options to configure (Restforce config)
Option 1
Set ENV variable as per Restforce doc
Option 2
In rails, write below code in application.rb or environment specific file
Other projects, run it before you use SaleforceOrm
SaleforceOrm::Configuration.restforce_config = {
... # Restforce configuration
}Usage
Create object class
class SampleObject < SalesforceOrm::ObjectBase
endobject_name
Default object name is class.name
SampleObjectIf you have a custom object name,
class SampleObject < SalesforceOrm::ObjectBase
self.object_name = 'SampleObject__c'
endfield_map
Field map is used for create, update actions. This can be used for aliasing the field names
Default field map for SampleObject
{
id: :Id,
created_at: :CreatedAt,
updated_at: :UpdatedAt
}If you wanna map more fields for an object
class SampleObject < SalesforceOrm::ObjectBase
self.field_map = {
field_one: :FieldOne,
field_two: :FieldTwo__c,
}
enddata_type_map
Allowed data types are,
:integer:float:date_time:date:array:boolean
Default is same data type of given value
Default data type map for SampleObject
{
created_at: :datetime,
updated_at: :datetime
}If you wanna change the data type of some fields
class SampleObject < SalesforceOrm::ObjectBase
self.data_type_map = {
field_one: :datetime,
field_two: :integer
}
endNOTE: It's mandatory to add data type map for boolean fields
record_type
By default there is no record type configured for any object
To specify a record type,
class SampleObject < SalesforceOrm::ObjectBase
self.record_type = 'Xyz' # DeveloperName in RecordType object
endAll the queries and create! method will automatically use record type
First time use the object, we make a call to Salesforce and find the record type by it's DeveloperName. This will be cached in memory.
With Rails in except in development or test env, we take the advantage of Rails.cache
Methods
Methods are similar to ActiveRecord::Base
Class methods
SampleObject.[
:create!,
:update_all!,
:destroy_all!,
:where,
:select,
:except,
:group,
:order,
:reorder,
:limit,
:offset,
:first,
:last,
:each,
:scoped,
:all,
:find_by_*
]eg:
SampleObject.where(id: 'qd')
SampleObject.where(id: ['eqd', 'qqwd'])
SampleObject.where(id: ['eqd', 'qqwd'], field_one: 'KJbn').where('a = b').all
SampleObject.where(id: 'qd').group(:a, :b).each do |sobj|
puts sobj.id
end
SampleObject.find('qwd')
SampleObject.find_by_id('qwd')
SampleObject.find_by_field_one_and_field_two_and_field_three(1, 2, 3)
SampleObject.select('count(id)').allNOTE: Salesforce API's accepts SOQL query as a URL params, so make sure URL length is not longer than 16087 chars
Instance methods
SampleObject.[
:update_attributes,
:destroy
]Other class methods (Specific to SalesforceOrm)
update_by_id!
To update an object by id
SampleObject.update_by_id!('some_id', {feild_one: 'some_value', field_two: 'some_other_value'})destroy_by_id!
To destroy an object by id
SampleObject.destroy_by_id!('some_id')to_soql
To generate, SOQL query (Equavalent to to_sql)
build
To create a new instance of SampleObject
SampleObject.build({id: 'some id', field_one: 'Some value'})Pending
- Default values
- Relationships
- More data types
- Better aggregate methods
Contributing
If you'd like to contribute a feature or bugfix: Thanks! To make sure your fix/feature has a high chance of being included, please read the following guidelines:
- Post a pull request.
- Make sure there are tests! We will not accept any patch that is not tested. It's a rare time when explicit tests aren't needed. If you have questions about writing tests for salesforce-orm, please open a GitHub issue.
Thank you to all the contributors!