Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Rails 3.x gem for moderating ActiveRecord models (like posts, attributes...).
Ruby Perl

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.




Add it to your project's Gemfile

gem "has_moderated"

and run

bundle install

To set up has_moderated in your project, use

rails generate has_moderated:install

rake db:migrate

This will generate a Moderation model and a migration for it.


When upgrading, rerun the generator

rails generate has_moderated:install

If there is a new migration file and you have filename conflicts, remove the old one and apply the new one, in case the schema changed.


To moderate one or more attributes, add

has_moderated :attr1, :attr2

to your model.

If you want to moderate the creation of a record (for example, you don't want new blog posts to show up until they are accepted by a moderator), use


You can also specify associations that need to be saved for moderation as well (if moderating the creation of new records) - for example, if a Post has_many :links, and you want to submit these links to moderation as well (note, if you don't, they will be discarded), use

has_moderated_create :with_associations => [:links]

in your Post model (post.rb). This only matters when you use has_moderated_create. You can also use

has_moderated_create :with_associations => :all

to include all associations, but I recommend you explicitly specify them if possible. By default, no associations are included.

To moderate destruction of records, use


Warning! Always put has_many etc. BEFORE has_moderated calls in your model!

Moderating associations on existing records

There is an automatic way to moderate associations on already-created records. Use:

has_moderated_association :links, :comments

to moderate the links and comments associations. You can use :all to moderate all associations, but I recommend you explicitly specify them.

You can also manually add associations to moderation like so

post.add_associations_moderated(:comments => [new_comment], :scores => [new_score])

The values can be either new records (not in the database), existing records, or Fixnum (numerical) IDs. Please note in this case you should not use .build to create new records, because if you call save on the parent model it will automatically create the record (this only applies if you use the manual way).

Manage moderations

To see pending moderations, simply call


You can also see moderations for a specific record. For example, if you have Post model, you can call moderations on it.

post = Post.first

Moderation is a normal ActiveRecord model, you can inspect it in rails console to see what it holds. Data (attr_value) is serialized in YAML format and can be deserialized by calling


To accept a moderation, call


to discard (destroy) it, call


Special data attached to moderations

If you need any special data attached to the Moderation model, you can use the moderation_creating hook.

Attaching user ID to moderations

For example you have a Comment model, and it is moderated. But your visitors are logged in when they post comments, so you want to add the user ID to the moderation.

  • first create a migration to add user_id into Moderation

    rails g migration AddUserIdToModerations user_id:integer

  • run rake db:migrate

  • in models/comment.rb, add something like this:

    attr_accessor :moderation_user_id
    moderation_creating do |m|
      m.user_id = self.moderation_user_id

This is just one example on how to do it. You need the attr_accessor here because we are going to pass the user ID from the controller. In the hook you have access to the Moderation model just before it is saved, so you can modify it like any other model. Now just set moderation_user_id on the model before you save it:

c =
c.moderation_user_id =

CarrierWave support

There is support for CarrierWave uploads to be moderated. You must put this line into the model that has a CarrierWave uploader mounted:

include HasModerated::CarrierWave

Right now *you must use the field name “photo” for the upload filename* because it is currently hardcoded into this module. If you do this, then moderation for the photo should work correctly.

It does not matter if this model has any moderation itself or if you just have an association to it from some other model that is moderated. You must include this module in either case, because it ensures proper serialization of the photo information. If you want to moderate changes to the photo on this model itself (e.g. not only when its associated to something else), add also

has_moderated :carrierwave_photo

If you need some more customization look at this module in lib/has_moderated/carrier_wave.rb and just copy the methods into your model and customize them (with some care when you do this, some methods should be class methods).


I've tested this project using RSpec. You can find the tests in


You can run the tests by running

rake spec

in the root directory.


DONT save association when calling .build… only when calling save!

This is just for my personal todo list… Amend moderations… Eg if you create a new record and save it, then change something additionally and save again. Preview method which gives changed object but doesnt save it.

For automagic associations, look at method concat, concat_records, add_to_target u get the instance of this class from with .association(“name”) assoc = t.association(:subtasks) def assoc.concat *args ; whatever ; end or if we need block (capture outer scope) metaclass = class << assoc; self; end metaclass.send(:define_method, :concat) do

puts "concat 2"


in model use after_initialize do…end to overwrite these methods ruby-1.8.7-p334 :013 > def assoc.concat_with_mo *args ruby-1.8.7-p334 :014?> puts “in concat mo” ruby-1.8.7-p334 :015?> concat_without_mo *args ruby-1.8.7-p334 :016?> end

=> nil

ruby-1.8.7-p334 :017 > assoc.class_eval do ruby-1.8.7-p334 :018 > alias_method_chain :concat, :mo ruby-1.8.7-p334 :019?> end use add_to_target!!! lowest lvl add something like has_moderated_association don't do anything on create (parent.new_record?) since we already handle that test also for one-to-one and join table and has_many through assoc

fix tests for offline working


You may encounter problems with models that have some sort of non-serializable attributes. This might be something like file attachments, you'll have to try it to see. If you have a problem like that you can extract the problematic attributes into a seperate has_one association. If you moderate create, save that model without the foreign key first, and then use has_moderated_create :with_associations => [:association_name] and add the association (to the existing associated model) before saving the moderated model. If you have questions about this or don't understand what I mean, open an issue here at GitHub and I will explain it further.


This project rocks and uses MIT-LICENSE.

Something went wrong with that request. Please try again.