I have been reading about using model concerns to skin-nize fat models as well as DRY up your model codes. Here is an explanation with examples:
1) DRYing up model codes
Consider a Article model, a Event model and a Comment model. An article or an event has many comments. A comment belongs to either Article or Event. 
Traditionally, the models may look like this:
Comment Model:
class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end
Article Model:
class Article < ActiveRecord::Base
  has_many :comments, as: :commentable 
  def find_first_comment
    comments.first(created_at DESC)
  end
  def self.least_commented
   #return the article with least number of comments
  end
end
Event Model
class Event < ActiveRecord::Base
  has_many :comments, as: :commentable 
  def find_first_comment
    comments.first(created_at DESC)
  end
  def self.least_commented
   #returns the event with least number of comments
  end
end
As we can notice, there is a significant piece of code common to both Event and Article. Using concerns we can extract this common code in a separate module Commentable. 
For this create a commentable.rb file in app/models/concerns.
module Commentable
  extend ActiveSupport::Concern
  included do
    has_many :comments, as: :commentable
  end
  # for the given article/event returns the first comment
  def find_first_comment
    comments.first(created_at DESC)
  end
  module ClassMethods
    def least_commented
      #returns the article/event which has the least number of comments
    end
  end
end
And now your models look like this :
Comment Model: 
class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end
Article Model:
class Article < ActiveRecord::Base
  include Commentable
end
Event Model:
class Event < ActiveRecord::Base
  include Commentable
end
2) Skin-nizing Fat Models.
Consider a Event model. A event has many attenders and comments.
Typically, the event model might look like this
class Event < ActiveRecord::Base   
  has_many :comments
  has_many :attenders
  def find_first_comment
    # for the given article/event returns the first comment
  end
  def find_comments_with_word(word)
    # for the given event returns an array of comments which contain the given word
  end 
  def self.least_commented
    # finds the event which has the least number of comments
  end
  def self.most_attended
    # returns the event with most number of attendes
  end
  def has_attendee(attendee_id)
    # returns true if the event has the mentioned attendee
  end
end
Models with many associations and otherwise have tendency to accumulate more and more code and become unmanageable. Concerns provide a way to skin-nize fat modules making them more modularized and easy to understand. 
The above model can be refactored using concerns as below:
Create a attendable.rb and commentable.rb file in app/models/concerns/event folder
attendable.rb
module Attendable
  extend ActiveSupport::Concern
  included do 
    has_many :attenders
  end
  def has_attender(attender_id)
    # returns true if the event has the mentioned attendee
  end
  module ClassMethods
    def most_attended
      # returns the event with most number of attendes
    end
  end
end
commentable.rb
module Commentable
  extend ActiveSupport::Concern
  included do 
    has_many :comments
  end
  def find_first_comment
    # for the given article/event returns the first comment
  end
  def find_comments_with_word(word)
    # for the given event returns an array of comments which contain the given word
  end
  module ClassMethods
    def least_commented
      # finds the event which has the least number of comments
    end
  end
end
And now using Concerns, your Event model reduces to 
class Event < ActiveRecord::Base
  include Commentable
  include Attendable
end
* While using concerns its advisable to go for 'domain' based grouping rather than 'technical' grouping. Domain Based grouping is like 'Commentable', 'Photoable', 'Attendable'. Technical grouping will mean 'ValidationMethods', 'FinderMethods' etc