Skip to content

Instantly share code, notes, and snippets.

@dhh
Created June 8, 2011 18:09
Show Gist options
  • Save dhh/1014971 to your computer and use it in GitHub Desktop.
Save dhh/1014971 to your computer and use it in GitHub Desktop.
Use concerns to keep your models manageable
# autoload concerns
module YourApp
class Application < Rails::Application
config.autoload_paths += %W(
#{config.root}/app/controllers/concerns
#{config.root}/app/models/concerns
)
end
end
# app/models/concerns/trashable.rb
module Trashable
extend ActiveSupport::Concern
included do
default_scope where(trashed: false)
scope :trashed, where(trashed: true)
end
def trash
update_attribute :trashed, true
end
end
# app/models/message.rb
class Message < ActiveRecord::Base
include Trashable, Subscribable, Commentable, Eventable
end
@PikachuEXE
Copy link

@justin808
I think you can create a folder called shared for all shared modules
So that you have to include Shared::Trashable in app/models/concerns/shared/trashable.rb, not just Trashable
Also if you got both Message::Trashable and Shared::Trashable, you won't be confused on which to include

@kevinzen
Copy link

I recently saw this article as a counterpoint to this approach to breaking down model classes:

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/

@amolpujari
Copy link

Great, I also found few more ways to keep your code modular - http://amolnpujari.wordpress.com/2013/04/09/184/

@ludyna
Copy link

ludyna commented Oct 27, 2014

concerns sucks compared to DCI. I hope ruby community will improve ruby to support DCI (extend/unextend modules on instances). Roles >>> concerns. Because roles are limited to contexts and you can't write spaghetti code, when you use method from role that should not be involved in current context. It is clear signal to developer - that something went wrong, architecture should be improved. In case of concerns you put everything in one object and let mess and spaghetti code happen in contexts (in Rails case in controllers or other "services" modules used by controllers).

@ludyna
Copy link

ludyna commented Oct 27, 2014

@QuotableWater7
Copy link

@IZBOR besides the fact that this discussion has nothing to do with DCI, DCI is slow and is not really spreading a ton because of that.

@Bartuz
Copy link

Bartuz commented Oct 24, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment