Rails 3: Polymorphic Associations in Action

Tags

,

Hi Folks,

In this short article, I would like to brief about “Rails polymorphic associations“. Below are the high-level pointers.

  • What is Polymorphic Association
  • How Rails handles it
  • Example explained
  • Demo

So, Let’s start:

  • What is Polymorphic Association: In OOP, Polymorphic means “of-many“.

There is a well documented and well explained Railscasts for this. Refer to this link for more information: http://railscasts.com/episodes/154-polymorphic-association

  • Example Explained:

Code snippet can be downloaded from Github. The path for the same is: git@github.com:puneetpandey/rails3_singleTableInheritance.git

Once set-up. Type the URL’s below:

  1. http://localhost:3000/events
  2. http://localhost:3000/users
Advertisements

How to submit your iOS application to Apple store

Tags

, ,

Hi Folks,

For all the iOS developers, who are developing an iOS application and now would like to submit their app to Apple store, all you need is to follow the below steps.

The article is updated according to the latest deployment changes introduced by Apple from March 1, 2013 onwards.

Prerequisite

1. Distribution Certificate

2. Provisioning Profile

3. Xcode 4.6.2

4. iOS 6 and above

5. Mac OS 10.8

6. An iPhone or iPad.

NOTE: I can’t cover how will you get the Distribution and Provisioning certificates and profiles, but in short I’ve created my account on developer.apple.com and the client for whom I worked with, has added me and provided me all the required certificates. But, if you would like to create your own, please read out apple documentation.

1 Distribution certificate: log-in to you developer.apple.com account. Go to -> Certificates, Identifier and Profiles under iOS Developer Program.

  • Click on ‘Certificates’ under iOS Apps.
  • Show the full list under ‘Certificates’ and click on ‘Distribution’.
  • You’ll find a Distribution Certificate (as Type). Download it.
  • Double click on it. It will be open in your ‘Key Chain‘ utility under ‘My Certificates‘.

2. Provisioning Profile: Follow step 1 of Distribution certificate.

  • Click on ‘Certificates’ under iOS Apps.
  • Show the full list under ‘Provisioning Profiles’ and click on ‘Distribution’.
  • You’ll find Distribution Provisioning Profile (as Type). Download it.
  • Double click on it. It will be open in your Xcode.

3. Attach your device with you Mac system and make sure it comes under your ‘Xcode Organizer’ menu.

4. Please keep in mind of below pointers:

  • Make sure your build is clean.
  • Make sure you’ve re-run your build once it’s cleaned.
  • Make sure you’ve run your build on the device to ensure everything is working fine. Because failure of just 1 piece of functionality will not allow you to submit your app to Apple store.
  • Make sure you’ve defined all the dependencies of your application (for e.g. Camera, Maps etc.). Because, when apple reviews your application, it checks weather all the dependencies all defined or not!

5. Your application submission depends on the below steps (we will cover each in detail):

  • Select your connected device near the ‘Run’ button.
  • Set the command line build to Distribution from the drop-down menu.
  • Open info.plist and change the bundle identifier to the appropriate one.
  • Make sure all the launch images are configured/defined properly.
  • Ensure to define distribution certificate under ‘Build Settings’ for Distribution entity.

6. Once all the checks are done. Go to ‘Edit Scheme’ -> ‘Archive’ and change the build configuration on the same window to Distribution.

7. Click on ‘Product’ -> ‘Archive’. This will clean, re-build your application. If no errors found, a new window will open (go to step 8). If error occurs (follow step 4 and 5).

8. You’re almost at the end. In the new window, 2 buttons will be there:

  • Validate and
  • Submit
  • Validate checks if all the required dependencies meet + builds your application
  • Submit validates your application. Requires itnues connect credentials.

I’ll add the necessary screenshots very soon.

Let me know if this article is helpful or need any modification.

Puneet Pandey

Rails 3: Single Table Inheritance

Tags

, ,

Hi Folks/Fellow Developers,

As I’ve seen lot many examples, articles over Single Table Inheritance, I decided to write my own. Thanks to the open source contributors. Their Articles/Examples helped me a lot writing this post.

As you might know about single table inheritance, let me quickly set the definition for it. Single-Table-Inheritance (STI) allows you to write/create sub-classes of a specific model. You can use a single table, add specific objects and extend the functionality/behavior of base model.

Current example explained:

My Current example is based on Mobile system. We have a single model called ‘Mobile’ and other models such as ‘Samsung’, ‘Apple’, ‘Nokia’ etc., that inherits the property of Mobile model. (Refer to the image for more help)

Single Table Inheritance

Single Table Inheritance

Development Platform used:

Ruby - 1.9.3
Rails - 3.2.13
Bundler- 1.3.5
DB - MySQL
IDE - Netbeans 6.9.1

The application is currently hosted on GitHub and can be cloned using the below command:
git clone git@github.com:puneetpandey/rails3_singleTableInheritance.git

Let me know your feedback about this application.

Happy Coding!
Puneet

How to index multiple documents with Solr

Tags

, , ,

Hi Folks,

Hope you all are fine and doing good. Few weeks back, I was looking into solr to see if it index multiple attachments! The requirement was very simple: A user will upload multiple files and solr will index those. I tried finding the solutions on the internet but found very basic ones.

Now, I am sharing my experience with you all with some code snippet, which will tell how to index multiple documents/attachments with Solr.

Model: job.rb

has_many :job_attachments
accepts_nested_attributes_for :job_attachments, :allow_destroy => true

Model: job_attachment.rb

belongs_to :job
has_attached_file :attachment

searchable :auto_index => false do
attachment :document_attachment
end

private
def document_attachment
"#{Rails.root}/public/#{self.attachment.url}"
end

So what this code snippet does? Whenever you run rake sunspot:reindex, it will index multiple files uploaded by a user.

Handling at controller side:

sunspot_str = params[:search]
search = Sunspot.search [Job, JobAttachment] do
fulltext sunspot_str, :minimum_match => 1
end
puts search_result = search.results

Hope this will help someone! Happy coding

FREEZE GEMS IN RAILS 3 APPLICATION

Tags

, , , ,

I have seen lots of forum, where developers keep on asking: “How would I freeze the gems to my Rails-3 application?”

Take this URL for example: http://bit.ly/gFzN6Z

One developer says that: localize your gems by running this command: bundle install –vendor/gems

Others refuses to go with this way. Here’s why?

  • We are moving away from the concepts of bundler
  • This will install the gem dependencies as well in your vendor/gems directory, which we don’t need at all. We need only those gems which are specific to our application.
  • You don’t need to unpack the gems and check them in to your app, because it doesn’t matter: you’re guaranteeing the same versions are being called regardless of where they are installed, which will likely vary from machine to machine anyways (.bundle/ should not be checked in to the repo) – so why stick another 60-80 MB of files into your repo that you won’t ever be changing or using?

So, there is no way you can localize your gems in a Rails-3 application. There are other ways you can perform in order to better use of bundler gem.

  • Use specific versions in your Gemfile and run bundle install –deployment on each target system where you need the exact gem versions.
  • While defining a new gem in Gemfile, assign a path to it. For example:
    gem 'paperclip', '2.3.15', :path => './vendor/gems/paperclip-2.3.15'
    Bundler will assume that it has to get the gem from vendor/gems folder. Once you’re done. run bundle install

CUSTOM VALIDATION IN PAPERCLIP

Tags

, , ,

In this short tutorial, I will explain you how you can add custom validation messages on the Attachment if you’re using Paperclip plugin or gem.

Way 1. This will work if you’re running your rails application on Windows Machine.
Solution: a) install mimetype-fu plugin.
b) Once installed, open Model, where paperclip settings has been defined. In my case, its User Model. Open it and add:

has_attached_file :avatar
validate :prohibited_ext
protected
def prohibited_ext
errors.add(:avatar, “Format #{File.mime_type?(avatar.path)} is invalid!”) unless File.mime_type?(avatar.path) == “application/exe”
end

UPGRADE RAILS PERFORMANCE

Tags

, , , ,

In this article, we will try to Enhance our rails application performance.

To know, how is your rails application is performing on different environments, you must need some plugin or gem. There are many gems/plugins already available which you can use and analyze the performance.

First of all, I would like to list down those, which I will cover in my next tutorials.

Once you configure anyone of those, you’ll come to know how is your rails application is performing. I personally advise to use New Relic or Rack-Bug.

There are several ways, where you can upgrade you rails application performance. Let’s see what are those and how they work…

  • Enable Caching
  • Load Less SQL Queries
  • Avoid using before_filter for loading heavy data

JOINS IN SQL

Tags

,

Sometimes, its very hard to keep Joins concept in mind.. Being a beginner, experienced SQL programmer, you should know the concept of JOINS.

In this article, I will show you the difference between:
1. JOINS and INCLUDE
2. How to you use JOINS in rails
3. JOINS over INCLUDE
4. JOINS and INCLUDE in RAILS-3

Let’s cover them in detail:
What is Join ?
The SQL JOIN clause is used whenever we have to select data from 2 or more tables.

To be able to use SQL JOIN clause to extract data from 2 (or more) tables, we need a relationship between certain columns in these tables.

Joins Type
1. OUTER JOIN
1.a. LEFT OUTER JOIN
1.b. RIGHT OUTER JOIN
2. Inner Join

Let’s take an example here:

<images comes here />

The INNER JOIN will select all rows from both tables as long as there is a match between the columns we are matching on. In case we have a customer in the Customers table, which still hasn’t made any orders (there are no entries for this customer in the Sales table), this customer will not be listed in the result of our SQL query above.

The second type of SQL JOIN is called SQL OUTER JOIN and it has 2 sub-types called LEFT OUTER JOIN and RIGHT OUTER JOIN.

The LEFT OUTER JOIN or simply LEFT JOIN (you can omit the OUTER keyword in most databases), selects all the rows from the first table listed after the FROM clause, no matter if they have matches in the second table.

So, far you must be cleared with what JOIN does!! Now, we will see what JOINS and INCLUDE gives us….

Consider these two statements:

User.find(:first, :include => :user_profiles)
User.find(:first, :joins => :albums)

<I am going to update this post soon.>

SEND TWEETS FROM RAILS APPLICATION

Tags

, , , , ,

So, we’re continuing from here: https://puneetitengineer.wordpress.com/2009/08/12/send-tweets-fr…ls-application/

So far we’ve covered the basics of it, now its time to create some controllers…. Open your command/terminal and fire this command:

ruby script/generate controller twitt

Once you’re done, open this file and write the below code inside it:

class TwittController < ApplicationController

gem(‘twitter4r’, ‘>=0.2.0′)
require ‘twitter’
require ‘twitter_search’
require ‘rubygems’
before_filter :authorize, :except => [:login, :authenticate, :save_users, :twitter_cred]

def login
@user = User.new
end

def authenticate

@user = User.new(params[:user])
client = Twitter::Client.new
if client.authenticate?(@user.username, @user.password)
@username = User.save_users(params[:user])
session[:user_id] = @user.id
session[:username] = @user.username
session[:password] = @user.password
redirect_to :action =>’post_status’
else
render :action =>’login’
end

end

end

Now, open /app/views/twitt/login.html.erb and paste below lines:

<% form_for :user, :url => { :action => :authenticate } do |form| %>

<%= label :user, :username, “UserName:” %>
<%= form.text_field :username, :size => 30 %>

<%= label :user, :password, “Password:” %>
<%= form.password_field :password, :size => 30 %>

<%= submit_tag “login” , :class => “submit” %>
<% end %>

INTEGRATE ORACLE WITH RUBY

Tags

, , , , , , , ,

Since most of the rails application is now using various databases, this article will show you how you can useORACLE database with rails.

For that, we need Oracle XE

I will update this post as soon as I can…. Apologize for the dealy. However, you can mail me any of your query if you are stuck in configuring Oracle with Rails.