Skip to content

Commit

Permalink
refs mongoid#177 added rake task to set slug for legacy data and test…
Browse files Browse the repository at this point in the history
… cases
  • Loading branch information
Anuja Joshi committed Nov 3, 2015
1 parent 59fced3 commit adb26ba
Show file tree
Hide file tree
Showing 8 changed files with 112 additions and 0 deletions.
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,16 @@ post = Post.find '50b1386a0482939864000001' # Finds by bson ids
```
[Examine slug.rb](lib/mongoid/slug.rb) for all available options.

To set slug for existing records run following rake task :

```ruby
rake mongoid_slug:set
```
You can pass model names as an option for which you want to set slug:

```ruby
rake mongoid_slug:set[Model1,Model2]
```
Custom Slug Generation
-------

Expand Down
7 changes: 7 additions & 0 deletions lib/mongoid/slug.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
require 'mongoid/slug/unique_slug'
require 'mongoid/slug/slug_id_strategy'
require 'mongoid-compatibility'
require 'mongoid/slug/railtie' if defined?(Rails)

module Mongoid
# Slugs your Mongoid model.
Expand All @@ -22,6 +23,12 @@ module Slug

# field :_slugs, type: Array, default: [], localize: false
# alias_attribute :slugs, :_slugs
@@classes ||= []
@@classes << self
end

def self.classes
@@classes
end

module ClassMethods
Expand Down
7 changes: 7 additions & 0 deletions lib/mongoid/slug/railtie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module Mongoid::Slug
class Railtie < Rails::Railtie
rake_tasks do
Dir[File.join(File.dirname(__FILE__), '../../tasks/*.rake')].each { |f| load f }
end
end
end
19 changes: 19 additions & 0 deletions lib/tasks/mongoid_slug.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace :mongoid_slug do

desc 'Goes though all documents and sets slug if not already set'
task :set => :environment do |t, args|
::Rails.application.eager_load! if defined?(Rails)

unless Mongoid::Slug.classes.blank?
models = args.extras
klasses = Mongoid::Slug.classes
klasses = (klasses.map(&:to_s) & models.map(&:classify)).map(&:constantize) unless models.blank?
klasses.each do |klass|
# set slug for objects having blank slug
klass.each { |object| object.set_slug! unless object.slugs? }
end
end
p "Completed mongoid_slug:set"
end

end
5 changes: 5 additions & 0 deletions spec/models/uninitalized_slug_first.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class UninitalizedSlugFirst
include Mongoid::Document
field :_id, type: Integer
field :name, type: String
end
5 changes: 5 additions & 0 deletions spec/models/uninitalized_slug_second.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class UninitalizedSlugSecond
include Mongoid::Document
field :_id, type: Integer
field :name, type: String
end
5 changes: 5 additions & 0 deletions spec/models/uninitalized_slug_third.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class UninitalizedSlugThird
include Mongoid::Document
field :_id, type: Integer
field :name, type: String
end
54 changes: 54 additions & 0 deletions spec/tasks/mongoid_slug_rake_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
require 'spec_helper'
require 'rake'

describe "mongoid_slug:set" do
before :all do
load File.expand_path("../../../lib/tasks/mongoid_slug.rake", __FILE__)
Rake::Task.define_task(:environment)
end

context 'when models parameter is passed' do
let!(:uninitalized_slug1) { UninitalizedSlugFirst.create(id: 455, name: 'uninitalized_slug1') }
let!(:uninitalized_slug2) { UninitalizedSlugSecond.create(id: 456, name: 'uninitalized_slug2') }

it 'Goes though all documents of passed models and sets slug if not already set' do

class UninitalizedSlugFirst
include Mongoid::Slug
slug :name
end

class UninitalizedSlugSecond
include Mongoid::Slug
slug :name
end

expect(uninitalized_slug1.slugs).to be_nil
expect(uninitalized_slug2.slugs).to be_nil

Rake::Task['mongoid_slug:set'].reenable
Rake::Task['mongoid_slug:set'].invoke('UninitalizedSlugFirst')

expect(uninitalized_slug1.reload.slugs).to eq(['uninitalized-slug1'])
expect(uninitalized_slug2.reload.slugs).to eq []
end
end

context 'when models parameter is not passed' do
let!(:uninitalized_slug3) { UninitalizedSlugThird.create(id: 70, name: 'uninitalized_slug3') }

it 'Goes though all documents and sets slug if not already set' do

class UninitalizedSlugThird
include Mongoid::Slug
slug :name
end
expect(uninitalized_slug3.slugs).to be_nil

Rake::Task['mongoid_slug:set'].reenable
Rake::Task['mongoid_slug:set'].invoke

expect(uninitalized_slug3.reload.slugs).to eq(['uninitalized-slug3'])
end
end
end

0 comments on commit adb26ba

Please sign in to comment.